diff --git a/README b/README
index ee138ac3d..8c8e8c957 100644
--- a/README
+++ b/README
@@ -1827,8 +1827,8 @@ Pipe tables look like this:
 The syntax is [the same as in PHP markdown extra].  The beginning and
 ending pipe characters are optional, but pipes are required between all
 columns.  The colons indicate column alignment as shown.  The header
-can be omitted, but the horizontal line must still be included, as
-it defines column alignments.
+cannot be omitted.  To simulate a headerless table, include a header
+with blank cells.
 
 Since the pipes indicate column boundaries, columns need not be vertically
 aligned, as they are in the above example.  So, this is a perfectly
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index 910936b34..fcd18fdc0 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -1287,11 +1287,9 @@ pipeBreak = try $ do
 
 pipeTable :: MarkdownParser ([Alignment], [Double], F [Blocks], F [[Blocks]])
 pipeTable = try $ do
-  (heads,aligns) <- try ( pipeBreak >>= \als ->
-                     return (return $ replicate (length als) mempty, als))
-                  <|> ( pipeTableRow >>= \row -> pipeBreak >>= \als ->
-
-                          return (row, als) )
+  (heads,aligns) <- pipeTableRow >>= \row ->
+                    pipeBreak >>= \als ->
+                    return (row, als)
   lines' <- sequence <$> many1 pipeTableRow
   let widths = replicate (length aligns) 0.0
   return $ (aligns, widths, heads, lines')
diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs
index 662373209..4ffdb2b36 100644
--- a/src/Text/Pandoc/Writers/Markdown.hs
+++ b/src/Text/Pandoc/Writers/Markdown.hs
@@ -508,7 +508,12 @@ pipeTable headless aligns rawHeaders rawRows = do
                              AlignCenter  -> ':':replicate w '-' ++ ":"
                              AlignRight   -> replicate (w + 1) '-' ++ ":"
                              AlignDefault -> replicate (w + 2) '-'
-  let header = if headless then empty else torow rawHeaders
+  -- note:  pipe tables can't completely lack a
+  -- header; for a headerless table, we need a header of empty cells.
+  -- see jgm/pandoc#1996.
+  let header = if headless
+                  then torow (replicate (length aligns) empty)
+                  else torow rawHeaders
   let border = nowrap $ text "|" <> hcat (intersperse (text "|") $
                         map toborder $ zip aligns widths) <> text "|"
   let body   = vcat $ map torow rawRows
diff --git a/tests/pipe-tables.txt b/tests/pipe-tables.txt
index ee8d54d9f..83debd595 100644
--- a/tests/pipe-tables.txt
+++ b/tests/pipe-tables.txt
@@ -1,7 +1,7 @@
 Simplest table without caption:
 
 | Default1 | Default2 | Default3 | 
-|----------|----------|----------|
+ |----------|----------|----------|
 |12|12|12|
 |123|123|123|
 |1|1|1|
@@ -27,6 +27,7 @@ Simple table without caption:
 
 Headerless table without caption:
 
+|       |      |        |
 |------:|:-----|:------:|
 |12|12|12|
 |123|123|123|
@@ -48,5 +49,6 @@ One-column:
 
 Header-less one-column:
 
+|   |
 |:-:|
 |hi|