Index: wp-admin/admin.php
===================================================================
--- wp-admin/admin.php	(revision )
+++ wp-admin/admin.php	(working copy)
@@ -88,16 +88,6 @@ if ( isset($_GET['page']) ) {
 	$plugin_page = plugin_basename($plugin_page);
 }
 
-if ( isset($_GET['post_type']) )
-	$typenow = sanitize_key($_GET['post_type']);
-else
-	$typenow = '';
-
-if ( isset($_GET['taxonomy']) )
-	$taxnow = sanitize_key($_GET['taxonomy']);
-else
-	$taxnow = '';
-
 if ( WP_NETWORK_ADMIN )
 	require(ABSPATH . 'wp-admin/network/menu.php');
 elseif ( WP_USER_ADMIN )
Index: wp-admin/includes/screen.php
===================================================================
--- wp-admin/includes/screen.php	(revision )
+++ wp-admin/includes/screen.php	(working copy)
@@ -333,11 +333,7 @@ function get_current_screen() {
  * @param string $id Screen id, optional.
  */
 function set_current_screen( $id =  '' ) {
-	global $current_screen;
-
-	$current_screen = new WP_Screen( $id );
-
-	$current_screen = apply_filters('current_screen', $current_screen);
+	WP_Screen::set_current_screen($id);
 }
 
 /**
@@ -422,7 +418,7 @@ final class WP_Screen {
 	 * @var string
 	 * @access public
 	 */
-	public $post_type;
+	public $post_type = '';
 
 	/**
 	 * The taxonomy associated with the screen, if any.
@@ -431,7 +427,7 @@ final class WP_Screen {
 	 * @var string
 	 * @access public
 	 */
-	public $taxonomy;
+	public $taxonomy = '';
 
 	/**
 	 * The help tab data associated with the screen, if any.
@@ -441,7 +437,7 @@ final class WP_Screen {
  	 * @access private
  	 */
 	private static $_help_tabs = array();
- 
+
  	/**
 	 * The help sidebar data associated with screens, if any.
 	 *
@@ -483,6 +479,19 @@ final class WP_Screen {
 	 */
 	private $_screen_settings;
 
+	public static function set_current_screen( $screen = '' ) {
+		global $current_screen, $typenow, $taxnow;
+
+		if ( is_string( $screen ) )
+			$screen = new WP_Screen( $screen );
+
+		$current_screen = $screen;
+		$current_screen = apply_filters('current_screen', $current_screen);
+var_dump( $current_screen );
+		$typenow = $current_screen->post_type;
+		$taxnow = $current_screen->taxonomy;
+	}
+
 	/**
 	 * Constructor
 	 *
@@ -491,8 +500,7 @@ final class WP_Screen {
 	 * @param string $id A screen id.  If empty, the $hook_suffix global is used to derive the ID.
 	 */
 	public function __construct( $id = '' ) {
-		global $hook_suffix, $typenow, $taxnow;
-
+		global $hook_suffix;
 		$action = '';
 
 		if ( empty( $id ) ) {
@@ -503,17 +511,14 @@ final class WP_Screen {
 			$screen = str_replace('-new', '', $screen);
 			$screen = str_replace('-add', '', $screen);
 			$this->id = $this->base = $screen;
+
+			if ( isset( $_GET['post_type'] ) )
+				$this->post_type = sanitize_key( $_GET['post_type'] );
+
+			if ( isset( $_GET['taxonomy'] ) )
+				$this->taxonomy = sanitize_key( $_GET['taxonomy'] );
 		} else {
-			$id = sanitize_key( $id );
-			if ( false !== strpos($id, '-') ) {
-				list( $id, $typenow ) = explode('-', $id, 2);
-				if ( taxonomy_exists( $typenow ) ) {
-					$id = 'edit-tags';
-					$taxnow = $typenow;
-					$typenow = '';
-				}
-			}
-			$this->id = $this->base = $id;
+			$this->id = $this->base = sanitize_key( $id );
 		}
 
 		$this->action = $action;
@@ -524,21 +529,20 @@ final class WP_Screen {
 		if ( 'index' == $this->id )
 			$this->id = 'dashboard';
 
-		if ( 'edit' == $this->id ) {
-			if ( empty($typenow) )
-				$typenow = 'post';
-			$this->id .= '-' . $typenow;
-			$this->post_type = $typenow;
-		} elseif ( 'post' == $this->id ) {
-			if ( empty($typenow) )
-				$typenow = 'post';
-			$this->id = $typenow;
-			$this->post_type = $typenow;
-		} elseif ( 'edit-tags' == $this->id ) {
-			if ( empty($taxnow) )
-				$taxnow = 'post_tag';
-			$this->id = 'edit-' . $taxnow;
-			$this->taxonomy = $taxnow;
+		// edit-tags.php should map to the correct taxonomy
+		if ( 'edit-tags' == $this->id ) {
+			if ( empty( $this->taxonomy ) )
+				$this->taxonomy = 'post_tag';
+			$this->id = 'edit-' . $this->taxonomy;
+		} else if ( 0 === strpos( 'edit-', $this->id ) && empty( $this->post_type ) ) {
+			// infer the $post_type from the ID if necessary
+			$this->post_type = substr( $this->id, 5 );
+		}
+
+		if ( $this->id == 'edit' ) {
+			if ( empty( $this->post_type ) )
+				$this->post_type = 'post';
+			$this->id = 'edit-' . $this->post_type;
 		}
 
 		$this->is_network = is_network_admin();
@@ -561,7 +565,7 @@ final class WP_Screen {
 	}
 
 	function add_old_compat_help( $help ) {
-		self::$_old_compat_help[ $this->id ] = $help;	
+		self::$_old_compat_help[ $this->id ] = $help;
 	}
 
 	/**
@@ -596,7 +600,7 @@ final class WP_Screen {
 	 *
 	 * @since 3.3.0
 	 *
-	 * @param string 
+	 * @param string
 	 */
 	public function get_option( $option, $key = false ) {
 		if ( ! isset( self::$_options[ $this->id ][ $option ] ) )
