Index: wp-comments-post.php
===================================================================
--- wp-comments-post.php	(revision 10933)
+++ wp-comments-post.php	(working copy)
@@ -17,6 +17,16 @@
 
 nocache_headers();
 
+function redirectBackToPost ($comment_post_ID, $errorCode) {
+  //  Work out the link we're redirecting back to
+  $postURL = get_permalink ($comment_post_ID);
+  if (strstr ($postURL, '?') !== false) $postURL .= "&"; else $postURL .= "?";
+  $postURL .= "commentErrorCode=".$errorCode;
+	//  Redirect to the post's comment section, but add the comment error message
+  header ("Location: ".$postURL);
+  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 +36,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 +69,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-content/themes/default/comments.php
===================================================================
--- wp-content/themes/default/comments.php	(revision 10933)
+++ wp-content/themes/default/comments.php	(working copy)
@@ -66,8 +66,10 @@
 
 <p>Logged in as <a href="<?php echo get_option('siteurl'); ?>/wp-admin/profile.php"><?php echo $user_identity; ?></a>. <a href="<?php echo wp_logout_url(get_permalink()); ?>" title="Log out of this account">Log out &raquo;</a></p>
 
-<?php else : ?>
+<?php else : 
 
+do_action ('comment_form_errors'); ?>
+
 <p><input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" size="22" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> />
 <label for="author"><small>Name <?php if ($req) echo "(required)"; ?></small></label></p>
 
Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 10933)
+++ 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.7.1
+ */
+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\">Something went wrong. No idea what.</p>\n";
+        break;
+    }
+  }
+}
+
 ?>
Index: wp-includes/default-filters.php
===================================================================
--- wp-includes/default-filters.php	(revision 10933)
+++ wp-includes/default-filters.php	(working copy)
@@ -123,6 +123,8 @@
 
 add_filter('comment_excerpt', 'convert_chars');
 
+add_action ('comment_form_errors', 'check_errors_on_comment_post');
+
 add_filter('list_cats', 'wptexturize');
 add_filter('single_post_title', 'wptexturize');
 
