Index: wp-admin/includes/plugin.php
===================================================================
--- wp-admin/includes/plugin.php	(revision 17268)
+++ wp-admin/includes/plugin.php	(working copy)
@@ -1320,7 +1320,7 @@
 		$url = '';
 	}
 
-	$url = esc_url($url);
+	$url = apply_filters( 'menu_page_url', esc_url($url), $menu_slug );
 
 	if ( $echo )
 		echo $url;
@@ -1342,11 +1342,12 @@
 	global $_wp_real_parent_file;
 	global $_wp_menu_nopriv;
 	global $_wp_submenu_nopriv;
+	$original_parent = $parent;
 
 	if ( !empty ( $parent ) && 'admin.php' != $parent ) {
 		if ( isset( $_wp_real_parent_file[$parent] ) )
 			$parent = $_wp_real_parent_file[$parent];
-		return $parent;
+		return apply_filters( 'admin_page_parent', $parent, $original_parent );
 	}
 
 	/*
@@ -1354,7 +1355,7 @@
 		if ( isset( $_wp_real_parent_file[$parent_file] ) )
 			$parent_file = $_wp_real_parent_file[$parent_file];
 
-		return $parent_file;
+		return apply_filters( 'admin_page_parent', $parent_file, $original_parent );
 	}
 	*/
 
@@ -1364,14 +1365,14 @@
 				$parent_file = $plugin_page;
 				if ( isset( $_wp_real_parent_file[$parent_file] ) )
 					$parent_file = $_wp_real_parent_file[$parent_file];
-				return $parent_file;
+				return apply_filters( 'admin_page_parent', $parent_file, $original_parent );
 			}
 		}
 		if ( isset( $_wp_menu_nopriv[$plugin_page] ) ) {
 			$parent_file = $plugin_page;
 			if ( isset( $_wp_real_parent_file[$parent_file] ) )
 					$parent_file = $_wp_real_parent_file[$parent_file];
-			return $parent_file;
+			return apply_filters( 'admin_page_parent', $parent_file, $original_parent );
 		}
 	}
 
@@ -1379,7 +1380,7 @@
 		$parent_file = $pagenow;
 		if ( isset( $_wp_real_parent_file[$parent_file] ) )
 			$parent_file = $_wp_real_parent_file[$parent_file];
-		return $parent_file;
+		return apply_filters( 'admin_page_parent', $parent_file, $original_parent );
 	}
 
 	foreach (array_keys( (array)$submenu ) as $parent) {
@@ -1388,21 +1389,21 @@
 				$parent = $_wp_real_parent_file[$parent];
 			if ( !empty($typenow) && ($submenu_array[2] == "$pagenow?post_type=$typenow") ) {
 				$parent_file = $parent;
-				return $parent;
+				return apply_filters( 'admin_page_parent', $parent, $original_parent );
 			} elseif ( $submenu_array[2] == $pagenow && empty($typenow) && ( empty($parent_file) || false === strpos($parent_file, '?') ) ) {
 				$parent_file = $parent;
-				return $parent;
+				return apply_filters( 'admin_page_parent', $parent, $original_parent );
 			} else
 				if ( isset( $plugin_page ) && ($plugin_page == $submenu_array[2] ) ) {
 					$parent_file = $parent;
-					return $parent;
+					return apply_filters( 'admin_page_parent', $parent, $original_parent );
 				}
 		}
 	}
 
 	if ( empty($parent_file) )
 		$parent_file = '';
-	return '';
+	return apply_filters( 'admin_page_parent', '', $original_parent );
 }
 
 function get_admin_page_title() {
@@ -1414,7 +1415,7 @@
 	global $typenow;
 
 	if ( ! empty ( $title ) )
-		return $title;
+		return apply_filters('admin_page_title',$title);
 
 	$hook = get_plugin_page_hook( $plugin_page, $pagenow );
 
@@ -1425,15 +1426,15 @@
 			if ( isset( $menu_array[3] ) ) {
 				if ( $menu_array[2] == $pagenow ) {
 					$title = $menu_array[3];
-					return $menu_array[3];
+					return apply_filters('admin_page_title',$menu_array[3]);
 				} else
 					if ( isset( $plugin_page ) && ($plugin_page == $menu_array[2] ) && ($hook == $menu_array[3] ) ) {
 						$title = $menu_array[3];
-						return $menu_array[3];
+						return apply_filters('admin_page_title',$menu_array[3]);
 					}
 			} else {
 				$title = $menu_array[0];
-				return $title;
+				return apply_filters('admin_page_title',$title);
 			}
 		}
 	} else {
@@ -1450,7 +1451,7 @@
 					)
 					) {
 						$title = $submenu_array[3];
-						return $submenu_array[3];
+						return apply_filters('admin_page_title',$submenu_array[3]);
 					}
 
 				if ( $submenu_array[2] != $pagenow || isset( $_GET['page'] ) ) // not the current page
@@ -1458,10 +1459,10 @@
 
 				if ( isset( $submenu_array[3] ) ) {
 					$title = $submenu_array[3];
-					return $submenu_array[3];
+					return apply_filters('admin_page_title',$submenu_array[3]);
 				} else {
 					$title = $submenu_array[0];
-					return $title;
+					return apply_filters('admin_page_title',$title);
 				}
 			}
 		}
@@ -1473,13 +1474,13 @@
 					( $parent1 == $menu_array[2] ) )
 					{
 						$title = $menu_array[3];
-						return $menu_array[3];
+						return apply_filters('admin_page_title',$menu_array[3]);
 					}
 			}
 		}
 	}
 
-	return $title;
+	return apply_filters('admin_page_title',$title);
 }
 
 function get_plugin_page_hook( $plugin_page, $parent_page ) {
@@ -1508,7 +1509,7 @@
 
 	$plugin_name = preg_replace( '!\.php!', '', $plugin_page );
 
-	return $page_type . '_page_' . $plugin_name;
+	return apply_filters( 'plugin_page_hookname', $page_type . '_page_' . $plugin_name,  $plugin_page, $parent_page );
 }
 
 function user_can_access_admin_page() {
@@ -1523,51 +1524,51 @@
 	$parent = get_admin_page_parent();
 
 	if ( !isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$parent][$pagenow] ) )
-		return false;
+		return apply_filters( 'user_can_access_admin_page', false );
 
 	if ( isset( $plugin_page ) ) {
 		if ( isset( $_wp_submenu_nopriv[$parent][$plugin_page] ) )
-			return false;
+			return apply_filters( 'user_can_access_admin_page', false );
 
 		$hookname = get_plugin_page_hookname($plugin_page, $parent);
 
 		if ( !isset($_registered_pages[$hookname]) )
-			return false;
+			return apply_filters( 'user_can_access_admin_page', false );
 	}
 
 	if ( empty( $parent) ) {
 		if ( isset( $_wp_menu_nopriv[$pagenow] ) )
-			return false;
+			return apply_filters( 'user_can_access_admin_page', false );
 		if ( isset( $_wp_submenu_nopriv[$pagenow][$pagenow] ) )
-			return false;
+			return apply_filters( 'user_can_access_admin_page', false );
 		if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) )
-			return false;
+			return apply_filters( 'user_can_access_admin_page', false );
 		if ( isset( $plugin_page ) && isset( $_wp_menu_nopriv[$plugin_page] ) )
-			return false;
+			return apply_filters( 'user_can_access_admin_page', false );
 		foreach (array_keys( $_wp_submenu_nopriv ) as $key ) {
 			if ( isset( $_wp_submenu_nopriv[$key][$pagenow] ) )
-				return false;
+				return apply_filters( 'user_can_access_admin_page', false );
 			if ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$key][$plugin_page] ) )
-			return false;
+				return apply_filters( 'user_can_access_admin_page', false );
 		}
-		return true;
+		return apply_filters( 'user_can_access_admin_page', true );
 	}
 
 	if ( isset( $plugin_page ) && ( $plugin_page == $parent ) && isset( $_wp_menu_nopriv[$plugin_page] ) )
-		return false;
+		return apply_filters( 'user_can_access_admin_page', false );
 
 	if ( isset( $submenu[$parent] ) ) {
 		foreach ( $submenu[$parent] as $submenu_array ) {
 			if ( isset( $plugin_page ) && ( $submenu_array[2] == $plugin_page ) ) {
 				if ( current_user_can( $submenu_array[1] ))
-					return true;
+					return apply_filters( 'user_can_access_admin_page', true );
 				else
-					return false;
+					return apply_filters( 'user_can_access_admin_page', false );
 			} else if ( $submenu_array[2] == $pagenow ) {
 				if ( current_user_can( $submenu_array[1] ))
-					return true;
+					return apply_filters( 'user_can_access_admin_page', true );
 				else
-					return false;
+					return apply_filters( 'user_can_access_admin_page', false );
 			}
 		}
 	}
@@ -1575,13 +1576,13 @@
 	foreach ( $menu as $menu_array ) {
 		if ( $menu_array[2] == $parent) {
 			if ( current_user_can( $menu_array[1] ))
-				return true;
+				return apply_filters( 'user_can_access_admin_page', true );
 			else
-				return false;
+				return apply_filters( 'user_can_access_admin_page', false );
 		}
 	}
 
-	return true;
+	return apply_filters( 'user_can_access_admin_page', true );
 }
 
 /* Whitelist functions */
