Index: wp-includes/plugin.php
===================================================================
--- wp-includes/plugin.php	(revision 13871)
+++ wp-includes/plugin.php	(working copy)
@@ -661,12 +661,13 @@
  * @param callback $callback The callback to run when the hook is called.
  */
 function register_uninstall_hook($file, $callback) {
-	// The option should not be autoloaded, because it is not needed in most
-	// cases. Emphasis should be put on using the 'uninstall.php' way of
-	// uninstalling the plugin.
+	$file = plugin_basename($file);
+
 	$uninstallable_plugins = (array) get_option('uninstall_plugins');
-	$uninstallable_plugins[plugin_basename($file)] = $callback;
+	$uninstallable_plugins[$file] = true;
 	update_option('uninstall_plugins', $uninstallable_plugins);
+
+	add_action('uninstall_' . $file, $callback);
 }
 
 /**
Index: wp-admin/includes/plugin.php
===================================================================
--- wp-admin/includes/plugin.php	(revision 13871)
+++ wp-admin/includes/plugin.php	(working copy)
@@ -479,7 +479,6 @@
 			$output = ob_get_clean();
 			return new WP_Error('unexpected_output', __('The plugin generated unexpected output.'), $output);
 		}
-		do_action( 'activate_plugin', trim( $plugin) );
 		if ( $network_wide ) {
 			$current[$plugin] = time();
 			update_site_option( 'active_sitewide_plugins', $current );
@@ -776,14 +775,12 @@
 	}
 
 	if ( isset( $uninstallable_plugins[$file] ) ) {
-		$callable = $uninstallable_plugins[$file];
 		unset($uninstallable_plugins[$file]);
 		update_option('uninstall_plugins', $uninstallable_plugins);
 		unset($uninstallable_plugins);
 
 		include WP_PLUGIN_DIR . '/' . $file;
 
-		add_action( 'uninstall_' . $file, $callable );
 		do_action( 'uninstall_' . $file );
 	}
 }
