Index: wp-admin/includes/plugin.php
===================================================================
--- wp-admin/includes/plugin.php	(revision 15671)
+++ wp-admin/includes/plugin.php	(working copy)
@@ -463,7 +463,7 @@
  * @param bool $network_wide Whether to enable the plugin for all sites in the network or just the current site.  Multisite only. Default is false.
  * @return WP_Error|null WP_Error on invalid file or null on success.
  */
-function activate_plugin( $plugin, $redirect = '', $network_wide = false) {
+function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
 	$plugin  = plugin_basename( trim( $plugin ) );
 
 	if ( is_multisite() && ( $network_wide || is_network_only_plugin($plugin) ) ) {
@@ -482,7 +482,10 @@
 			wp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); // we'll override this later if the plugin can be included without fatal error
 		ob_start();
 		include(WP_PLUGIN_DIR . '/' . $plugin);
-		do_action( 'activate_plugin', trim( $plugin) );
+		// Silent mode is used by plugin updater to safely de/reactivate 
+		// an active plugin without rerunning activation hooks
+		if ( ! $silent )
+			do_action( 'activate_plugin', trim( $plugin) );
 		if ( $network_wide ) {
 			$current[$plugin] = time();
 			update_site_option( 'active_sitewide_plugins', $current );
@@ -491,8 +494,10 @@
 			sort($current);
 			update_option('active_plugins', $current);
 		}
-		do_action( 'activate_' . trim( $plugin ) );
-		do_action( 'activated_plugin', trim( $plugin) );
+		if ( ! $silent ) {
+			do_action( 'activate_' . trim( $plugin ) );
+			do_action( 'activated_plugin', trim( $plugin ) );
+		}
 		if ( ob_get_length() > 0 ) {
 			$output = ob_get_clean();
 			return new WP_Error('unexpected_output', __('The plugin generated unexpected output.'), $output);
@@ -568,15 +573,15 @@
  * @param bool $network_wide Whether to enable the plugin for all sites in the network.
  * @return bool|WP_Error True when finished or WP_Error if there were errors during a plugin activation.
  */
-function activate_plugins($plugins, $redirect = '', $network_wide) {
+function activate_plugins( $plugins, $redirect = '', $network_wide, $silent = false ) {
 	if ( !is_array($plugins) )
 		$plugins = array($plugins);
 
 	$errors = array();
-	foreach ( (array) $plugins as $plugin ) {
+	foreach ( $plugins as $plugin ) {
 		if ( !empty($redirect) )
 			$redirect = add_query_arg('plugin', $plugin, $redirect);
-		$result = activate_plugin($plugin, $redirect, $network_wide);
+		$result = activate_plugin($plugin, $redirect, $network_wide, $silent);
 		if ( is_wp_error($result) )
 			$errors[$plugin] = $result;
 	}
Index: wp-admin/update.php
===================================================================
--- wp-admin/update.php	(revision 15671)
+++ wp-admin/update.php	(working copy)
@@ -69,7 +69,7 @@
 		check_admin_referer('activate-plugin_' . $plugin);
 		if ( ! isset($_GET['failure']) && ! isset($_GET['success']) ) {
 			wp_redirect( 'update.php?action=activate-plugin&failure=true&plugin=' . $plugin . '&_wpnonce=' . $_GET['_wpnonce'] );
-			activate_plugin( $plugin, '', ! empty( $_GET['networkwide'] ) );
+			activate_plugin( $plugin, '', ! empty( $_GET['networkwide'] ), true );
 			wp_redirect( 'update.php?action=activate-plugin&success=true&plugin=' . $plugin . '&_wpnonce=' . $_GET['_wpnonce'] );
 			die();
 		}
