Index: wp-comments-post.php
===================================================================
--- wp-comments-post.php	(revision 10988)
+++ wp-comments-post.php	(working copy)
@@ -17,6 +17,12 @@
 
 nocache_headers();
 
+function redirectBackToPost ($comment_post_ID, $errorCode) {
+	//  Redirect to the post's comment section, but add the comment error message
+  wp_redirect (add_query_arg ("commentErrorCode", $errorCode, get_permalink ($comment_post_ID)));
+  die;
+}
+
 $comment_post_ID = (int) $_POST['comment_post_ID'];
 
 $status = $wpdb->get_row( $wpdb->prepare("SELECT post_status, comment_status FROM $wpdb->posts WHERE ID = %d", $comment_post_ID) );
@@ -26,7 +32,7 @@
 	exit;
 } elseif ( !comments_open($comment_post_ID) ) {
 	do_action('comment_closed', $comment_post_ID);
-	wp_die( __('Sorry, comments are closed for this item.') );
+  redirectBackToPost ($comment_post_ID, 4);
 } elseif ( in_array($status->post_status, array('draft', 'pending') ) ) {
 	do_action('comment_on_draft', $comment_post_ID);
 	exit;
@@ -59,14 +65,15 @@
 $comment_type = '';
 
 if ( get_option('require_name_email') && !$user->ID ) {
-	if ( 6 > strlen($comment_author_email) || '' == $comment_author )
-		wp_die( __('Error: please fill the required fields (name, email).') );
+	if ( '' == $comment_author_email || '' == $comment_author )
+		redirectBackToPost ($comment_post_ID, 3);
 	elseif ( !is_email($comment_author_email))
-		wp_die( __('Error: please enter a valid email address.') );
+		redirectBackToPost ($comment_post_ID, 2);
 }
 
+//  Comment blank?
 if ( '' == $comment_content )
-	wp_die( __('Error: please type a comment.') );
+  redirectBackToPost ($comment_post_ID, 1);
 
 $comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0;
 
Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 10988)
+++ wp-includes/comment.php	(working copy)
@@ -1638,4 +1638,40 @@
 	return $open;
 }
 
+/**
+ * Echos error messages given when trying to post a comment. Hooked to comment_form
+ *
+ * @since 2.8
+ */
+function check_errors_on_comment_post () {
+  /*  Error codes are as follows:
+   *  1     Comment was left blank
+   *  2     Email address wasn't valid
+   *  3     Name or email address weren't set
+   *  4     Comments are closed
+   */
+  
+  //  Only bother with anything if there's an error code set
+  if (isset ($_GET['commentErrorCode'])) {
+    switch ($_GET['commentErrorCode']) {
+      case 1:
+        echo "<p id=\"commentError\">".__("Message can't be blank.")."</p>\n";
+        break;
+      case 2:
+        echo "<p id=\"commentError\">".__("Invalid email address.")."</p>\n";
+        break;
+      case 3:
+        echo "<p id=\"commentError\">".__("Name and email address are required fields.")."</p>\n";
+        break;
+      case 4:
+        echo "<p id=\"commentError\">".__("Sorry, comments are closed for this item.")."</p>\n";
+        break;
+      default:
+        //  We should never get here, but just in case
+        echo "<p id=\"commentError\">".__("Received unknown error value.")."</p>\n";
+        break;
+    }
+  }
+}
+
 ?>
Index: wp-includes/default-filters.php
===================================================================
--- wp-includes/default-filters.php	(revision 10988)
+++ wp-includes/default-filters.php	(working copy)
@@ -123,6 +123,8 @@
 
 add_filter('comment_excerpt', 'convert_chars');
 
+add_action ('comment_form', 'check_errors_on_comment_post', 11);
+
 add_filter('list_cats', 'wptexturize');
 add_filter('single_post_title', 'wptexturize');
 

