Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 6343)
+++ /CKEditor/trunk/CHANGES.html	(revision 6344)
@@ -43,4 +43,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6641">#6641</a> : The <a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.dialog_buttonsOrder">dialog_buttonsOrder</a> now works on IE.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6869">#6869</a> : The "data-cke-nostyle" attribute (which was introduced for escaping element from been touched by the style system since 3.5) is deprecated in favor of  the new one <strong>"data-nostyle"</strong>.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6107">#6107</a> : It's now possible to remove block styles.</li>
 	</ul>
 	<p>
Index: /CKEditor/trunk/_source/plugins/format/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/format/plugin.js	(revision 6343)
+++ /CKEditor/trunk/_source/plugins/format/plugin.js	(revision 6344)
@@ -55,5 +55,8 @@
 					editor.fire( 'saveSnapshot' );
 
-					styles[ value ].apply( editor.document );
+					var style = styles[ value ],
+						elementPath = new CKEDITOR.dom.elementPath( editor.getSelection().getStartElement() );
+
+					style[ style.checkActive( elementPath ) ? 'remove' : 'apply' ]( editor.document );
 
 					// Save the undo snapshot after all changes are affected. (#4899)
Index: /CKEditor/trunk/_source/plugins/styles/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 6343)
+++ /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 6344)
@@ -150,4 +150,6 @@
 						this.type == CKEDITOR.STYLE_INLINE ?
 							removeInlineStyle
+						: this.type == CKEDITOR.STYLE_BLOCK ?
+							removeBlockStyle
 						: this.type == CKEDITOR.STYLE_OBJECT ?
 							removeObjectStyle
@@ -882,4 +884,21 @@
 	}
 
+	function removeBlockStyle( range )
+	{
+		// Serializible bookmarks is needed here since
+		// elements may be merged.
+		var bookmark = range.createBookmark( 1 );
+
+		var iterator = range.createIterator();
+		iterator.enforceRealBlocks = true;
+		iterator.enlargeBr = this._.enterMode != CKEDITOR.ENTER_BR;
+
+		var block;
+		while ( ( block = iterator.getNextParagraph() ) )
+			this.checkElementRemovable( block ) && removeFromElement( this, block, 1 );
+
+		range.moveToBookmark( bookmark );
+	}
+
 	// Replace the original block with new one, with special treatment
 	// for <pre> blocks to make sure content format is well preserved, and merging/splitting adjacent
@@ -1091,5 +1110,10 @@
 		}
 
-		removeEmpty && removeNoAttribsElement( element );
+		if ( removeEmpty )
+		{
+			!CKEDITOR.dtd.$block[ element.getName() ] || style._.enterMode == CKEDITOR.ENTER_BR && !element.hasAttributes() ?
+				removeNoAttribsElement( element ) :
+				element.renameNode( style._.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
+		}
 	}
 
@@ -1161,4 +1185,5 @@
 	}
 
+	var nonWhitespaces = CKEDITOR.dom.walker.whitespaces( 1 );
 	// If the element has no more attributes, remove it.
 	function removeNoAttribsElement( element )
@@ -1168,19 +1193,35 @@
 		if ( !element.hasAttributes() )
 		{
-			// Removing elements may open points where merging is possible,
-			// so let's cache the first and last nodes for later checking.
-			var firstChild	= element.getFirst();
-			var lastChild	= element.getLast();
-
-			element.remove( true );
-
-			if ( firstChild )
-			{
-				// Check the cached nodes for merging.
-				firstChild.type == CKEDITOR.NODE_ELEMENT && firstChild.mergeSiblings();
-
-				if ( lastChild && !firstChild.equals( lastChild )
-					&& lastChild.type == CKEDITOR.NODE_ELEMENT  )
-					lastChild.mergeSiblings();
+			if ( CKEDITOR.dtd.$block[ element.getName() ] )
+			{
+				var previous = element.getPrevious( nonWhitespaces ),
+						next = element.getNext( nonWhitespaces );
+
+				if ( previous && ( previous.type == CKEDITOR.NODE_TEXT || !previous.isBlockBoundary( { br : 1 } ) ) )
+					element.append( 'br', 1 );
+				if ( next && ( next.type == CKEDITOR.NODE_TEXT || !next.isBlockBoundary( { br : 1 } ) ) )
+					element.append( 'br' );
+
+				element.remove( true );
+			}
+			else
+			{
+				// Removing elements may open points where merging is possible,
+				// so let's cache the first and last nodes for later checking.
+				var firstChild = element.getFirst();
+				var lastChild = element.getLast();
+
+				element.remove( true );
+
+				if ( firstChild )
+				{
+					// Check the cached nodes for merging.
+					firstChild.type == CKEDITOR.NODE_ELEMENT && firstChild.mergeSiblings();
+
+					if ( lastChild && !firstChild.equals( lastChild )
+							&& lastChild.type == CKEDITOR.NODE_ELEMENT )
+						lastChild.mergeSiblings();
+				}
+
 			}
 		}
@@ -1437,7 +1478,5 @@
 		var iterator = ranges.createIterator();
 		while ( ( range = iterator.getNextRange() ) )
-		{
 			func.call( this, range );
-		}
 
 		selection.selectRanges( ranges );
Index: /CKEditor/trunk/_source/plugins/stylescombo/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/stylescombo/plugin.js	(revision 6343)
+++ /CKEditor/trunk/_source/plugins/stylescombo/plugin.js	(revision 6344)
@@ -107,10 +107,5 @@
 						var elementPath = new CKEDITOR.dom.elementPath( selection.getStartElement() );
 
-						if ( style.type == CKEDITOR.STYLE_INLINE && style.checkActive( elementPath ) )
-							style.remove( editor.document );
-						else if ( style.type == CKEDITOR.STYLE_OBJECT && style.checkActive( elementPath ) )
-							style.remove( editor.document );
-						else
-							style.apply( editor.document );
+						style[ style.checkActive( elementPath ) ? 'remove' : 'apply' ]( editor.document );
 
 						editor.fire( 'saveSnapshot' );
