Index: docutils/parsers/rst/states.py
===================================================================
--- docutils/parsers/rst/states.py	(revision 10154)
+++ docutils/parsers/rst/states.py	(working copy)
@@ -1727,7 +1727,7 @@
                 return [], messages, blank_finish
         for i in range(len(block)):     # check right edge
             if len(block[i]) != width or block[i][-1] not in '+|':
-                messages.extend(self.malformed_table(block))
+                messages.extend(self.malformed_table(block, 'Misaligned right border.', i))
                 return [], messages, blank_finish
         return block, messages, blank_finish
 
@@ -1748,7 +1748,7 @@
                     self.state_machine.next_line(i - start)
                     messages = self.malformed_table(
                         lines[start:i+1], 'Bottom/header table border does '
-                        'not match top border.')
+                        'not match top border.', i)
                     return [], messages, i == limit or not lines[i+1].strip()
                 found += 1
                 found_at = i
@@ -1758,16 +1758,18 @@
             i += 1
         else:                           # reached end of input_lines
             if found:
-                extra = ' or no blank line after table bottom'
                 self.state_machine.next_line(found_at - start)
                 block = lines[start:found_at+1]
+                messages = self.malformed_table(
+                    block, 'No blank line after table bottom.', found_at)
             else:
-                extra = ''
                 self.state_machine.next_line(i - start - 1)
                 block = lines[start:]
-            messages = self.malformed_table(
-                block, 'No bottom table border found%s.' % extra)
-            return [], messages, not extra
+                # TODO: line numbers are wrong if there was an included file?
+                offset = i - start if not self.state_machine.document.include_log else 0
+                messages = self.malformed_table(
+                    block, 'No bottom table border found.', offset)
+            return [], messages, not found
         self.state_machine.next_line(end - start)
         block = lines[start:end+1]
         # for East Asian chars:
@@ -1774,7 +1776,7 @@
         block.pad_double_width(self.double_width_pad_char)
         return block, [], end == limit or not lines[end+1].strip()
 
-    def malformed_table(self, block, detail='', offset=0):
+    def malformed_table(self, block, detail, offset):
         block.replace(self.double_width_pad_char, '')
         data = '\n'.join(block)
         message = 'Malformed table.'
Index: test/test_parsers/test_rst/test_tables.py
===================================================================
--- test/test_parsers/test_rst/test_tables.py	(revision 10154)
+++ test/test_parsers/test_rst/test_tables.py	(working copy)
@@ -29,6 +29,7 @@
 
 class ParserTestCase(unittest.TestCase):
     def test_parser(self):
+        self.maxDiff = None
         parser = Parser()
         settings = get_default_settings(Parser)
         settings.warning_stream = ''
@@ -89,9 +90,10 @@
 """,
 """\
 <document source="test data">
-    <system_message level="3" line="1" source="test data" type="ERROR">
+    <system_message level="3" line="2" source="test data" type="ERROR">
         <paragraph>
             Malformed table.
+            misaligned right border
         <literal_block xml:space="preserve">
             +-----------------------+
             | A malformed table. |
@@ -870,7 +872,7 @@
 """,
 """\
 <document source="test data">
-    <system_message level="3" line="1" source="test data" type="ERROR">
+    <system_message level="3" line="4" source="test data" type="ERROR">
         <paragraph>
             Malformed table.
             No bottom table border found.
@@ -888,10 +890,10 @@
 """,
 """\
 <document source="test data">
-    <system_message level="3" line="1" source="test data" type="ERROR">
+    <system_message level="3" line="4" source="test data" type="ERROR">
         <paragraph>
             Malformed table.
-            No bottom table border found or no blank line after table bottom.
+            No blank line after table bottom.
         <literal_block xml:space="preserve">
             ==============  ======
             A simple table  cell 2
@@ -948,10 +950,10 @@
 """,
 """\
 <document source="test data">
-    <system_message level="3" line="1" source="test data" type="ERROR">
+    <system_message level="3" line="4" source="test data" type="ERROR">
         <paragraph>
             Malformed table.
-            No bottom table border found or no blank line after table bottom.
+            No blank line after table bottom.
         <literal_block xml:space="preserve">
             ==============  ======
             A simple table  cell 2
@@ -1115,7 +1117,7 @@
 """,
 """\
 <document source="test data">
-    <system_message level="3" line="1" source="test data" type="ERROR">
+    <system_message level="3" line="4" source="test data" type="ERROR">
         <paragraph>
             Malformed table.
             Bottom/header table border does not match top border.
