Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 6983)
+++ /CKEditor/trunk/CHANGES.html	(revision 6984)
@@ -44,4 +44,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6462">#6462</a> : A wider range of CSS length units (like pt and percentage) are now supported in related dialog fields.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/7911">#7911</a> : New Remove Anchor option is now available in the context menu.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7387">#7387</a> : Allow styleDefinitions that can be applied to a set of elements.</li>
 	</ul>
 	<p>
Index: /CKEditor/trunk/_source/core/dom/node.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/node.js	(revision 6983)
+++ /CKEditor/trunk/_source/core/dom/node.js	(revision 6984)
@@ -489,5 +489,6 @@
 		/**
 		 * Gets the closest ancestor node of this node, specified by its node name.
-		 * @param {String} name The node name of the ancestor node to search.
+		 * @param {String} reference The node name of the ancestor node to search, or
+		 * an object with the names to search for (since 3.6.1)
 		 * @param {Boolean} [includeSelf] Whether to include the current
 		 * node in the search.
@@ -500,8 +501,10 @@
 		 * ascendant = node.getAscendant( 'b' );        // ascendant == null
 		 * ascendant = node.getAscendant( 'b', true );  // ascendant == &lt;b&gt;
-		 */
-		getAscendant : function( name, includeSelf )
-		{
-			var $ = this.$;
+		 * ascendant = node.getAscendant( { div: 1, p: 1} );      // Searchs for the first 'div' or 'p': ascendant == &lt;div id="inner"&gt
+		 */
+		getAscendant : function( reference, includeSelf )
+		{
+			var $ = this.$,
+				name;
 
 			if ( !includeSelf )
@@ -510,5 +513,5 @@
 			while ( $ )
 			{
-				if ( $.nodeName && $.nodeName.toLowerCase() == name )
+				if ( $.nodeName && ( name = $.nodeName.toLowerCase(), ( typeof reference == 'string' ? name == reference : name in reference ) ) )
 					return new CKEDITOR.dom.node( $ );
 
Index: /CKEditor/trunk/_source/plugins/styles/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 6983)
+++ /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 6984)
@@ -99,5 +99,7 @@
 		}
 
-		var element = this.element = ( styleDefinition.element || '*' ).toLowerCase();
+		var element = this.element = styleDefinition.element ?
+				( typeof styleDefinition.element == 'string' ? styleDefinition.element.toLowerCase() : styleDefinition.element )
+				: '*';
 
 		this.type =
@@ -108,4 +110,8 @@
 			:
 				CKEDITOR.STYLE_INLINE;
+
+		// If the 'element' property is an object with a set of possible element, it will be applied like an object style: only to existing elements
+		if ( typeof this.element == 'object' )
+			this.type = CKEDITOR.STYLE_OBJECT;
 
 		this._ =
@@ -180,7 +186,10 @@
 							continue;
 
-						if( this.type == CKEDITOR.STYLE_OBJECT
-							 && !( element.getName() in objectElements ) )
+						if( this.type == CKEDITOR.STYLE_OBJECT )
+						{
+							var name = element.getName();
+							if ( !( typeof this.element == 'string' ? name == this.element : name in this.element ) )
 								continue;
+						}
 
 						if ( this.checkElementRemovable( element, true ) )
@@ -218,8 +227,9 @@
 
 			var def = this._.definition,
-				attribs;
+				attribs,
+				name = element.getName();
 
 			// If the element name is the same as the style name.
-			if ( element.getName() == this.element )
+			if ( typeof this.element == 'string' ? name == this.element : name in this.element )
 			{
 				// If no attributes are defined in the element.
