Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 4081)
+++ wp-includes/comment.php	(working copy)
@@ -635,15 +635,35 @@
 }
 
 function generic_ping($post_id = 0) {
+	$errors = get_option('ping_errors');
+	if ( !is_array($errors) )
+		$errors = array();
 	$services = get_settings('ping_sites');
 	$services = preg_replace("|(\s)+|", '$1', $services); // Kill dupe lines
 	$services = trim($services);
 	if ( '' != $services ) {
+		$update_ping_sites = false;
 		$services = explode("\n", $services);
-		foreach ($services as $service) {
-			weblog_ping($service);
+		foreach ($services as $i => $service) {
+			$error = weblog_ping($service);
+			if ( $error ) {
+				if ( !isset($errors[$service]) )
+					$errors[$service] = array('count' => 0);
+				$errors[$service]['count']++;
+				$errors[$service]['last_message'] = $error;
+				if ( $errors[$service]['count'] > 25 ||
+					 $errors[$service]['count'] > 2 && $error == "DO NOT PING THIS SERVICE AGAIN!" ) {
+					unset($services[$i]);
+					$update_ping_sites = true;
+				}
+			} else {
+				unset($errors[$service]);
+			}
 		}
+		if ($update_ping_sites)
+			update_option('ping_sites', implode("\n", $services));
 	}
+	update_option('ping_errors', $errors);
 
 	return $post_id;
 }
@@ -791,6 +811,18 @@
 	$home = trailingslashit( get_option('home') );
 	if ( !$client->query('weblogUpdates.extendedPing', get_settings('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping
 		$client->query('weblogUpdates.ping', get_settings('blogname'), $home);
+
+	$error = false;
+	if ( $client->isError() ) {
+		$error = $client->getErrorMessage();
+	} else {
+		$response = $client->getResponse();
+		if ( !isset($response['flerror']) || $response['flerror'] ) {
+			$error = isset($response['message']) && $response['message']
+			    ? $response['message'] : 'Invalid response';
+		}
+	}
+	return $error;
 }
 
 ?>
Index: wp-admin/options-writing.php
===================================================================
--- wp-admin/options-writing.php	(revision 4081)
+++ wp-admin/options-writing.php	(working copy)
@@ -99,6 +99,28 @@
 <p><?php _e('When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see <a href="http://codex.wordpress.org/Update_Services">Update Services</a> on the Codex. Separate multiple service URIs with line breaks.') ?></p>
 
 <textarea name="ping_sites" id="ping_sites" style="width: 98%;" rows="3" cols="50"><?php form_option('ping_sites'); ?></textarea>
+
+<?php
+$min_ping_error_count = 3;
+?>
+<p><?php _e('These update services has failed the last ' . $min_ping_error_count . ' times or more. You should consider removing these services from the list above.') ?></p>
+<dl>
+<?php
+$has_errors = false;
+$services = get_option('ping_sites');
+foreach (get_option('ping_errors') as $service => $error) :
+if ($error['count'] >= $min_ping_error_count && strpos($services, $service) !== false) :
+echo "<dt>" . htmlspecialchars($service) . "<dt>";
+echo "<dd>" . htmlspecialchars($error['last_message']) . "<dd>";
+$has_errors = true;
+endif;
+endforeach;
+
+if (!$has_errors) :
+echo "<dd><em>" . __('No errors') . "</em></dd>";
+endif;
+?>
+</dl>
 </fieldset>
 
 <p class="submit">
