Index: wp-includes/theme.php
===================================================================
--- wp-includes/theme.php	(revision 15593)
+++ wp-includes/theme.php	(working copy)
@@ -1035,6 +1035,10 @@
  * inherit from a parent theme can just overload one file.
  *
  * @since 2.7.0
+ * @uses apply_filters() Calls 'locate_template' filter on array of template names.
+ * @uses apply_filters() Calls "locate_template-$template_name" filter on template name.
+ * @uses apply_filters() Calls "locate_template_path-$template_name" filter on empty string, to be used to explicit define a template path.
+ * @uses apply_filters() Calls 'locate_template_located' filter on located template.
  *
  * @param array $template_names Array of template files to search for in priority order.
  * @param bool $load If true the template file will be loaded if it is found.
@@ -1045,11 +1049,18 @@
 	if ( !is_array($template_names) )
 		return '';
 
+	$template_names = apply_filters( 'locate_template', $template_names, $load, $require_once );
+
 	$located = '';
 	foreach ( $template_names as $template_name ) {
+		$template_name = apply_filters( "locate_template-$template_name", $template_name, $load, $require_once );
 		if ( !$template_name )
 			continue;
-		if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
+		$template_path = apply_filters( "locate_template_path-$template_name", '', $template_name, $load, $require_once );
+		if ( !empty( $template_path ) && file_exists( $template_path ) ) {
+			$located = $template_path;
+			break;
+		} else if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
 			$located = STYLESHEETPATH . '/' . $template_name;
 			break;
 		} else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
@@ -1058,6 +1069,8 @@
 		}
 	}
 
+	$located = apply_filters( 'locate_template_located', $located, $template_names, $load, $require_once );
+
 	if ( $load && '' != $located )
 		load_template( $located, $require_once );
 
