diff --git a/modules/comment/comment.module b/modules/comment/comment.module
index 6f0df6cae1..ac44cd0a6f 100644
--- a/modules/comment/comment.module
+++ b/modules/comment/comment.module
@@ -2072,7 +2072,10 @@ function comment_preview($comment) {
 
   if (!form_get_errors()) {
     $comment_body = field_get_items('comment', $comment, 'comment_body');
-    $comment->format = $comment_body[0]['format'];
+    // Empty comments and plain text comments do not have a format.
+    if ($comment_body && isset($comment_body[0]['format'])) {
+      $comment->format = $comment_body[0]['format'];
+    }
     // Attach the user and time information.
     if (!empty($comment->name)) {
       $account = user_load_by_name($comment->name);
@@ -2197,18 +2200,23 @@ function comment_submit($comment) {
     // 2) Strip out all HTML tags
     // 3) Convert entities back to plain-text.
     $field = field_info_field('comment_body');
+    // Do not try to extract from comment_body if no such field exists.
     $langcode = field_is_translatable('comment', $field) ? entity_language('comment', $comment) : LANGUAGE_NONE;
-    $comment_body = $comment->comment_body[$langcode][0];
-    if (isset($comment_body['format'])) {
-      $comment_text = check_markup($comment_body['value'], $comment_body['format']);
-    }
-    else {
-      $comment_text = check_plain($comment_body['value']);
+    if ($field && isset($comment->comment_body[$langcode][0])) {
+      $comment_body = $comment->comment_body[$langcode][0];
+      if (isset($comment_body['format'])) {
+        $comment_text = check_markup($comment_body['value'], $comment_body['format']);
+      }
+      elseif (isset($comment_body['value'])) {
+        $comment_text = check_plain($comment_body['value']);
+      }
+      if (isset($comment_text)) {
+        $comment->subject = truncate_utf8(trim(decode_entities(strip_tags($comment_text))), 29, TRUE);
+      }
     }
-    $comment->subject = truncate_utf8(trim(decode_entities(strip_tags($comment_text))), 29, TRUE);
-    // Edge cases where the comment body is populated only by HTML tags will
-    // require a default subject.
-    if ($comment->subject == '') {
+    // Edge cases where the comment body is populated only by HTML tags or does
+    // not exist will require a default subject.
+    if (trim($comment->subject) == '') {
       $comment->subject = t('(No subject)');
     }
   }
diff --git a/modules/comment/comment.test b/modules/comment/comment.test
index e087a7173e..73342d48cd 100644
--- a/modules/comment/comment.test
+++ b/modules/comment/comment.test
@@ -2050,6 +2050,68 @@ class CommentFieldsTest extends CommentHelperCase {
   }
 
   /**
+   * Tests trying to save a comment with an empty, required body.
+   *
+   * Trying to save should generate a warning and fail.
+   */
+  function testCommentEmptyRequiredBody() {
+    // Set the requirement-indicator of the comment_body field.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('instance[required]' => TRUE);
+    $this->drupalPost('admin/structure/types/manage/article/comment/fields/comment_body', $edit, t('Save settings'));
+
+    // Preview an empty comment, and check if an error is shown.
+    $this->drupalPost('node/' . $this->node->nid, array(), t('Preview'));
+    $this->assertText('Comment field is required.', 'Cannot preview comment with empty required body.');
+
+    // Post an empty comment, and check if an error is shown.
+    $this->drupalPost('node/' . $this->node->nid, array(), t('Save'));
+    $this->assertText('Comment field is required.', 'Cannot save comment with empty required body.');
+  }
+
+  /**
+   * Tests trying to save a comment with an empty, NON-required body.
+   *
+   * Trying to save should succeed and not generate a warning.
+   */
+  function testCommentEmptyNonRequiredBody() {
+    // Set the requirement-indicator of the comment_body field.
+    $this->drupalLogin($this->admin_user);
+    $edit = array('instance[required]' => FALSE);
+    $this->drupalPost('admin/structure/types/manage/article/comment/fields/comment_body', $edit, t('Save settings'));
+
+    // Preview an empty comment, and check if an error is shown.
+    $this->drupalPost('node/' . $this->node->nid, array(), t('Preview'));
+    $this->assertNoText('Comment field is required.', 'Can preview comment with empty required body.');
+
+    // Post an empty comment, and check if an error is shown.
+    $this->drupalPost('node/' . $this->node->nid, array(), t('Save'));
+    $this->assertNoText('Comment field is required.', 'Can save comment with empty required body.');
+    $this->assertText('Your comment has been posted.', 'Can save comment with empty required body.');
+  }
+
+  /**
+   * Tests that the comment_body field is not required.
+   *
+   * It should be possible to preview and save a comment without the
+   * comment_body field and without generating warnings.
+   */
+  function testCommentDeletedBody() {
+    // Delete the comment_body field.
+    $this->drupalLogin($this->admin_user);
+    $this->drupalPost('admin/structure/types/manage/article/comment/fields/comment_body/delete', array(), t('Delete'));
+
+    // Preview an empty comment.
+    $this->drupalPost('node/' . $this->node->nid, array(), t('Preview'));
+
+    // Post an empty comment.
+    $this->drupalPost('node/' . $this->node->nid, array(), t('Save'));
+
+    // View the comment administration overview page.
+    $this->drupalGet('admin/content/comment');
+  }
+
+  /**
    * Tests that the default 'comment_body' field is correctly added.
    */
   function testCommentDefaultFields() {
