Index: wp-includes/ms-functions.php
===================================================================
--- wp-includes/ms-functions.php	(revision 28517)
+++ wp-includes/ms-functions.php	(working copy)
@@ -1761,7 +1761,7 @@
  * WordPress MS stores a blog's post count as an option so as
  * to avoid extraneous COUNTs when a blog's details are fetched
  * with get_blog_details(). This function is called when posts
- * are published to make sure the count stays current.
+ * are published or unpublished to make sure the count stays current.
  *
  * @since MU
  */
Index: wp-includes/ms-default-filters.php
===================================================================
--- wp-includes/ms-default-filters.php	(revision 28517)
+++ wp-includes/ms-default-filters.php	(working copy)
@@ -34,9 +34,10 @@
 
 // Administration
 add_filter( 'term_id_filter', 'global_terms', 10, 2 );
-add_action( 'publish_post', 'update_posts_count' );
+add_action( 'delete_post', '_update_posts_count_on_delete' );
 add_action( 'delete_post', '_update_blog_date_on_post_delete' );
 add_action( 'transition_post_status', '_update_blog_date_on_post_publish', 10, 3 );
+add_action( 'transition_post_status', '_update_posts_count_on_transition_post_status', 10, 2 );
 
 // Counts
 add_action( 'admin_init', 'wp_schedule_update_network_counts');
Index: wp-includes/ms-blogs.php
===================================================================
--- wp-includes/ms-blogs.php	(revision 28517)
+++ wp-includes/ms-blogs.php	(working copy)
@@ -892,3 +892,43 @@
 	wpmu_update_blogs_date();
 }
 
+/**
+ * Handler for updating the blog posts count date when a post is deleted.
+ *
+ * @since 4.0
+ *
+ * @param int $post_id Post ID
+ */
+function _update_posts_count_on_delete($post_id)
+{
+	//First check if this was a published post.
+	$post = get_post($post_id);
+	if($post->post_status != "publish")
+		return;
+
+	//Must be pusblished. Update the posts count.
+	update_posts_count();
+}
+
+/**
+ * Handler for updating the blog posts count date when a post status changes.
+ *
+ * @since 4.0
+ *
+ * @param string $new_status The status the post is changing to.
+ * @param string $old_status The status the post is changing from.
+ */
+function _update_posts_count_on_transition_post_status($new_status, $old_status)
+{
+	//If the status isn't really changing, we don't need to update the count.
+	if($new_status == $old_status)
+		return;
+
+	//If neither the new or old status is publish, we don't need to update the count.
+	if($new_status != "publish" && $old_status != "publish")
+		return;
+
+	//Okay. Update the posts count.
+	update_posts_count();
+}
+
