diff --git a/includes/class-main.php b/includes/class-main.php
index 2705149ca224fd789f4ad7a74d96c509d0f76553..0b280d78e1d528ba129c806c8c1b66955c30c9e7 100644
--- a/includes/class-main.php
+++ b/includes/class-main.php
@@ -32,6 +32,7 @@ class Main {
 	public static function load() {
 		add_action( self::CRON_EVENT, array( __CLASS__, 'do_cron' ) );
 
+		// TODO: add for upload.php and edit-comments.php. Anything else?
 		add_action( 'load-edit.php', array( __CLASS__, 'intercept' ) );
 
 		add_action( 'admin_notices', array( __CLASS__, 'admin_notices' ) );
@@ -62,13 +63,14 @@ class Main {
 		$vars   = self::capture_vars();
 		$action = self::build_hook( $vars->action );
 
-		if ( ! self::bulk_action_allowed( $vars->action ) ) {
-			return;
-		}
-
-		// Nothing to do, unless we're emptying the trash.
-		if ( empty( $vars->posts ) && 'delete_all' !== $vars->action ) {
-			self::do_admin_redirect( self::ADMIN_NOTICE_KEY, false );
+		// What kind of actions is this?
+		if ( self::is_core_action( $vars->action ) ) {
+			// Nothing to do, unless we're emptying the trash.
+			if ( empty( $vars->posts ) && 'delete_all' !== $vars->action ) {
+				self::do_admin_redirect( self::ADMIN_NOTICE_KEY, false );
+			}
+		} else {
+			// Do something special to offload custom things?
 		}
 
 		// Pass request to a class to handle offloading to cron, UX, etc.
@@ -99,11 +101,24 @@ class Main {
 	 * Capture relevant variables
 	 */
 	private static function capture_vars() {
-		$vars = array_merge( array( 'action', 'user_id' ), self::get_supported_vars() );
+		$vars = array( 'action', 'user_id', 'current_screen' ); // Extra data that normally would be available from the context.
+		$vars = array_merge( $vars, self::get_supported_vars() );
 		$vars = (object) array_fill_keys( $vars, null );
 
+		// All permissions checks must be re-implemented!
 		$vars->user_id = get_current_user_id();
 
+		// Some dynamic hooks need screen data, but we don't need help and other private data.
+		// Fortunately, Core's private convention is used in the \WP_Screen class.
+		$screen = get_current_screen();
+		$screen = get_object_vars( $screen );
+		$screen = array_filter( $screen, function( $key ) {
+			return 0 !== strpos( $key, '_' );
+		}, ARRAY_FILTER_USE_KEY );
+		$vars->current_screen = (object) $screen;
+		unset( $screen );
+
+		// Remainder of data comes from $_REQUEST
 		if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) ) {
 			$vars->action = 'delete_all';
 		} elseif ( isset( $_REQUEST['action'] ) && '-1' !== $_REQUEST['action'] ) {
@@ -202,13 +217,13 @@ class Main {
 	}
 
 	/**
-	 * Validate action
+	 * Is this one of Core's default actions, or a custom action
 	 *
 	 * @param  string $action Action parsed from request vars.
 	 * @return bool
 	 */
-	public static function bulk_action_allowed( $action ) {
-		$allowed_actions = array(
+	public static function is_core_action( $action ) {
+		$core_actions = array(
 			'delete', // class Delete_Permanently.
 			'delete_all', // class Delete_All.
 			'edit', // class Edit.
@@ -216,7 +231,7 @@ class Main {
 			'untrash', // class Restore_From_Trash.
 		);
 
-		return in_array( $action, $allowed_actions, true );
+		return in_array( $action, $core_actions, true );
 	}
 
 	/**