Index: src/wp-admin/includes/plugin.php
===================================================================
--- src/wp-admin/includes/plugin.php	(revision 38266)
+++ src/wp-admin/includes/plugin.php	(working copy)
@@ -589,6 +589,45 @@
 			 *                           or just the current site. Multisite only. Default is false.
 			 */
 			do_action( 'activate_' . $plugin, $network_wide );
+
+			if ( $network_wide ) {
+				/**
+				 * Fires as a specific plugin is being activated for a network.
+				 *
+				 * This hook is the "activation" hook used internally by register_activation_hook().
+				 * The dynamic portion of the hook name, `$plugin`, refers to the plugin basename.
+				 *
+				 * If a plugin is silently activated (such as during an update), this hook does not fire.
+				 *
+				 * @since 4.7.0
+				 */
+				do_action( 'activate_' . $plugin . '_for_network' );
+
+				if ( has_action( 'activate_' . $plugin . '_for_site' ) && ! wp_is_large_network( 'sites' ) ) {
+					$site_ids = get_sites( array( 'fields' => 'ids', 'network_id' => get_network()->id ) );
+
+					foreach ( $site_ids as $site_id ) {
+						switch_to_blog( $site_id );
+
+						/**
+						 * Fires as a specific plugin is being activated for a site.
+						 *
+						 * This hook is the "activation" hook used internally by register_activation_hook().
+						 * The dynamic portion of the hook name, `$plugin`, refers to the plugin basename.
+						 *
+						 * If a plugin is silently activated (such as during an update), this hook does not fire.
+						 *
+						 * @since 4.7.0
+						 */
+						do_action( 'activate_' . $plugin . '_for_site' );
+
+						restore_current_blog();
+					}
+				}
+			} else {
+				/** This action is documented in wp-admin/includes/plugin.php */
+				do_action( 'activate_' . $plugin . '_for_site' );
+			}
 		}
 
 		if ( $network_wide ) {
Index: src/wp-includes/plugin.php
===================================================================
--- src/wp-includes/plugin.php	(revision 38266)
+++ src/wp-includes/plugin.php	(working copy)
@@ -825,13 +825,23 @@
  * 'activate_sample.php'.
  *
  * @since 2.0.0
+ * @since 4.7.0 The `$context` parameter was added.
  *
  * @param string   $file     The filename of the plugin including the path.
  * @param callable $function The function hooked to the 'activate_PLUGIN' action.
+ * @param string   $context  Optional. Either 'site', 'network', or empty for an
+ *                           undefined context.
  */
-function register_activation_hook($file, $function) {
+function register_activation_hook( $file, $function, $context = '' ) {
 	$file = plugin_basename($file);
-	add_action('activate_' . $file, $function);
+
+	if ( 'network' === $context ) {
+		add_action( 'activate_' . $file . '_for_network', $function );
+	} elseif ( 'site' === $context ) {
+		add_action( 'activate_' . $file . '_for_site', $function );
+	} else {
+		add_action( 'activate_' . $file, $function );
+	}
 }
 
 /**
