Index: src/wp-includes/query.php
===================================================================
--- src/wp-includes/query.php	(revision 28554)
+++ src/wp-includes/query.php	(working copy)
@@ -2183,6 +2183,21 @@
 		 */
 		do_action_ref_array( 'pre_get_posts', array( &$this ) );
 
+		if ( ! is_admin() && $this->is_main_query() ) {
+			/**
+			 * Fires after the query variable object is created, but before the actual query is run.
+			 *
+			 * Note: If using conditional tags, use the method versions within the passed instance
+			 * (e.g. $this->is_main_query() instead of is_main_query()). This is because the functions
+			 * like is_main_query() test against the global $wp_query instance, not the passed one.
+			 *
+			 * @since 4.0.0
+			 *
+			 * @param WP_Query &$this The WP_Query instance (passed by reference).
+			 */
+			do_action_ref_array( 'pre_main_query', array( &$this ) );
+		}
+
 		// Shorthand.
 		$q = &$this->query_vars;
 
