Index: wp-includes/class-wp.php
===================================================================
--- wp-includes/class-wp.php	(revision 18362)
+++ wp-includes/class-wp.php	(working copy)
@@ -15,7 +15,7 @@
 	 * @access public
 	 * @var array
 	 */
-	var $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'debug', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type');
+	var $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'debug', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type', 'post_or_root_page');
 
 	/**
 	 * Private query variables.
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 18362)
+++ wp-includes/post.php	(working copy)
@@ -3172,6 +3172,9 @@
 	if ( empty($pages) )
 		return $null;
 
+	if ( 1 == count($pages) )
+		return get_page($pages[0]->ID, $output, $post_type);		
+
 	foreach ( $pages as $page ) {
 		$path = '/' . $leaf_path;
 		$curpage = $page;
@@ -3180,6 +3183,8 @@
 			$curpage = wp_cache_get( $post_parent, 'posts' );
 			if ( false === $curpage )
 				$curpage = $wpdb->get_row( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE ID = %d and post_type = %s", $post_parent, $post_type ) );
+			if ( ! $curpage )
+				break;
 			$path = '/' . $curpage->post_name . $path;
 		}
 
Index: wp-includes/query.php
===================================================================
--- wp-includes/query.php	(revision 18362)
+++ wp-includes/query.php	(working copy)
@@ -1634,6 +1634,11 @@
 			}
 		}
 
+		if ( ! empty( $qv['post_or_root_page'] ) ) {
+			$qv['post_type'] = array( 'post', 'page' );
+			$qv['post_parent'] = 0;
+		}
+
 		if ( !empty($qv['post_type']) ) {
 			if ( is_array($qv['post_type']) )
 				$qv['post_type'] = array_map('sanitize_key', $qv['post_type']);
@@ -2106,14 +2111,19 @@
 				} else {
 					$reqpage = get_page_by_path($q['pagename']);
 				}
-				if ( !empty($reqpage) )
+				if ( !empty($reqpage) ) {
 					$reqpage = $reqpage->ID;
-				else
-					$reqpage = 0;
+				} else {
+					// Assume it's a post attachment.
+					$this->is_attachment = true;
+					$post_type = $q['post_type'] = 'attachment';
+					$q['attachment'] = $q['name'] = sanitize_title_for_query( wp_basename( $q['pagename'] ) );
+					$where .= " AND $wpdb->posts.post_name = '" . $q['attachment'] . "'";
+				}
 			}
 
 			$page_for_posts = get_option('page_for_posts');
-			if  ( ('page' != get_option('show_on_front') ) || empty($page_for_posts) || ( $reqpage != $page_for_posts ) ) {
+			if  ( isset($reqpage) && ( ('page' != get_option('show_on_front') ) || empty($page_for_posts) || ( $reqpage != $page_for_posts ) ) ) {
 				$q['pagename'] = sanitize_title_for_query( wp_basename( $q['pagename'] ) );
 				$q['name'] = $q['pagename'];
 				$where .= " AND ($wpdb->posts.ID = '$reqpage')";
Index: wp-includes/rewrite.php
===================================================================
--- wp-includes/rewrite.php	(revision 18362)
+++ wp-includes/rewrite.php	(working copy)
@@ -597,6 +597,8 @@
 	 */
 	var $use_verbose_page_rules = true;
 
+	var $use_verbose_attachment_rules = false;
+
 	/**
 	 * Permalink structure search for preg_replace.
 	 *
@@ -1440,7 +1442,7 @@
 					$rewrite = array_merge(array($trackbackmatch => $trackbackquery), $rewrite);
 
 					//add regexes/queries for attachments, attachment trackbacks and so on
-					if ( ! $page ) //require <permalink>/attachment/stuff form for pages because of confusion with subpages
+					if ( ! $page && ! $this->use_verbose_attachment_rules ) //require <permalink>/attachment/stuff form for pages because of confusion with subpages
 						$rewrite = array_merge($rewrite, array($sub1 => $subquery, $sub1tb => $subtbquery, $sub1feed => $subfeedquery, $sub1feed2 => $subfeedquery, $sub1comment => $subcommentquery));
 					$rewrite = array_merge(array($sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery, $sub2comment => $subcommentquery), $rewrite);
 				}
@@ -1908,10 +1910,16 @@
 		$this->use_trailing_slashes = ( '/' == substr($this->permalink_structure, -1, 1) );
 
 		// Enable generic rules for pages if permalink structure doesn't begin with a wildcard.
-		if ( preg_match("/^[^%]*%(?:postname|category|tag|author)%/", $this->permalink_structure) )
-			 $this->use_verbose_page_rules = true;
+		if ( preg_match("/^[^%]*%(?:category|tag|author)%/", $this->permalink_structure) )
+			$this->use_verbose_page_rules = true;
 		else
 			$this->use_verbose_page_rules = false;
+
+		// In the event the permalink structure atarts with /%postname% do a post||page post_type query
+		if ( strpos($this->permalink_structure, '/%postname%') == 0 ) {
+			$this->add_rewrite_tag('%postname%', "([^/]+)", 'post_or_root_page=1&name=');
+			$this->use_verbose_attachment_rules = true;
+		}
 	}
 
 	/**
