diff --git a/changelog b/changelog
index e01a19158..c80418aa5 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,461 @@
+pandoc (2.4)
+
+  [new features]
+
+  * New input format `man` (Yan Pashkovsky, John MacFarlane).
+
+  [behavior changes]
+
+  * `--ascii` is now implemented in the writers, not in Text.Pandoc.App,
+    via the new `writerPreferAscii` field in `WriterOptions`.
+    Now the `write*` functions for Docbook, HTML, ICML, JATS, LaTeX,
+    Ms, Markdown, and OPML are sensitive to `writerPreferAscii`.
+    Previously the to-ascii translation was done in Text.Pandoc.App,
+    and thus not available to those using the writer functions
+    directly.
+
+  * `--ascii` now works with Markdown output.  HTML5 character reference
+    entities are used.
+
+  * `--ascii` now works with LaTeX output. 100% ASCII output can't be
+    guaranteed, but the writer will use commands like `\"{a}` and `\l`
+    whenever possible, to avoid emiting a non-ASCII character.
+
+  * For HTML5 output, `--ascii` now uses HTML5 character reference
+    entities rather than numerical entities.
+
+  * Improved detection of format based on extension (in Text.Pandoc.App).
+    We now ensure that if someone tries to convert a file for a
+    format that has a pandoc writer but not a reader, it won't just
+    default to markdown.
+
+  * Add viz. to abbreviations file (#5007, Nick Fleisher).
+
+  * RST writer: Use simple tables when possible (#4750).
+
+  * CommonMark (and gfm) writer: Add plain text fallbacks. (#4528,
+    quasicomputational). Previously, the writer would unconditionally
+    emit HTML output for subscripts, superscripts, strikeouts (if the
+    strikeout extension is disabled) and small caps, even with
+    `raw_html` disabled. Now there are plain-text (and, where
+    possible, fancy Unicode) fallbacks for all of these corresponding
+    (mostly) to the Markdown fallbacks, and the HTML output is only
+    used when `raw_html` is enabled.
+
+  * Powerpoint writer: support raw openxml (Jesse Rosenthal, #4976).
+    This allows raw openxml blocks and inlines to be used in the pptx 
+    writer. Caveats: (1) It's up to the user to write
+    well-formed openxml. The chances for corruption, especially with
+    such a brittle format as pptx, is high. (2) Because of
+    the tricky way that blocks map onto shapes, if you are using
+    a raw block, it should be the only block on a slide
+    (otherwise other text might end up overlapping it). (3) The
+    pptx ooxml namespace abbreviations are different from the
+    docx ooxml namespaces. Again, it's up to the user to get it
+    right. Unzipped document and ooxml specification should be
+    consulted.
+
+  * With `--katex` in HTML formats, do not use the autorenderer (#4946).
+    We no longer surround formulas with `\(..\)` or `\[..\]`. Instead,
+    we tell katex to convert the contents of span elements with
+    class "math". Since math has already been identified, this
+    avoids wasted time parsing for LaTeX delimiters. Note, however,
+    that this may yield unexpected results if you have span elements
+    with class "math" that don't contain LaTeX math.
+    Also, use latest version of KaTeX by default (0.9.0).
+
+  * The man writer now produces ASCII-only output, using groff escapes,
+    for portability.
+
+  * ODT writer:
+
+    + Add title, author and date to metadata; any remaining
+      metadata fields are added as `meta:user-defined` tags.
+    + Implement table caption numbering (#4949, Nils Carlson).
+      Captioned tables are numbered and labeled with format "Table 1:
+      caption", where "Table" is replaced by a translation, depending
+      on the value of `lang` in metadata. Uncaptioned tables are not
+      enumerated.
+    + OpenDocument writer: Implement figure numbering in captions (#4944,
+      Nils Carlson). Figure captions are now numbered 1, 2, 3, ...
+      The format in the caption is "Figure 1: caption" and so on
+      (where "Figure" is replaced by a translation, depending on the
+      value of `lang` in the metadata). Captioned figures are numbered
+      consecutively and uncaptioned figures are not enumerated. This
+      is necessary in order for LibreOffice to generate an
+      Illustration Index (Table of Figures) for included figures.
+
+  * RST reader: Pass through fields in unknown directives as div attributes
+    (#4715). Support `class` and `name` attributes for all directives.
+
+  * Org reader: Add partial support for `#+EXCLUDE_TAGS` option. (#4284,
+    Brian Leung). Headers with the corresponding tags should not
+    appear in the output.
+
+  * Log warnings about missing title attributes now include a
+    suggestion about how to fix the problem (#4909).
+
+  * Lua filter changes (Albert Krewinkel):
+
+    + Report traceback when an error occurs. A proper Lua traceback is
+      added if either loading of a file or execution of a filter
+      function fails. This should be of help to authors of Lua filters
+      who need to debug their code.
+
+    + Allow access to pandoc state (#5015). Lua filters and custom
+      writers now have read-only access to most fields of pandoc's
+      internal state via the global variable `PANDOC_STATE`.
+
+    + Push ListAttributes via constructor (Albert Krewinkel).
+      This ensures that ListAttributes, as present in OrderedList elements,
+      have additional accessors (viz. `start`, `style`, and `delimiter`).
+
+    + Rename ReaderOptions fields, use snake_case. Snake case is used
+      in most variable names, using camelCase for these fields was an
+      oversight. A metatable is added to ensure that the old field
+      names remain functional.
+
+    + Iterate over AST element fields when using `pairs`. This makes
+      it possible to iterate over all ield names of an AST element by
+      using a generic `for` loop with pairs`:
+
+          for field_name, field_content in pairs(element) do
+          ... 
+          end
+
+      Raw table fields of AST elements should be considered an
+      implementation detail and might change in the future. Accessing
+      element properties should always happen through the fields
+      listed in the Lua filter docs.
+
+      Note that the iterator currently excludes the `t`/`tag` field.
+
+    + Ensure that MetaList elements behave like Lists. Methods usable
+      on Lists can also be used on MetaList objects.
+
+    + Fix MetaList constructor (Albert Krewinkel). Passing a MetaList
+      object to the constructor `pandoc.MetaList` now returns the
+      passed list as a MetaList. This is consistent with the
+      constructor behavior when passed an (untagged) list.
+
+  * Custom writers: Custom writers have access to the global variable
+    `PANDOC_DOCUMENT`(Albert Krewinkel, #4957). The variable contains
+    a userdata wrapper around the full pandoc AST and exposes two
+    fields, `meta` and `blocks`. The field content is only
+    marshaled on-demand, performance of scripts not accessing the
+    fields remains unaffected.
+
+  [API changes]
+
+  * Text.Pandoc.Options: add `writerPreferAscii` to `WriterOptions`.
+
+  * Text.Pandoc.Shared: export `splitSentences`. This was previously
+    duplicated in the Man and Ms writers.
+
+  * New exported module Text.Pandoc.Filter (Albert Krewinkel).
+
+  * Text.Pandoc.Parsing
+
+    + Generalize `gridTableWith` to any `Char` Stream (Alexander Krotov).
+    + Generalize `readWithM` from `[Char]` to any `Char` Stream.
+
+  * New exposed module Text.Pandoc.Filter (Albert Krewinkel).
+
+  * Text.Pandoc.XML: add `toHtml5Entities`.
+
+  * New exported module Text.Pandoc.Readers.Man (Yan Pashkovsky, John
+    MacFarlane).
+
+  * Text.Pandoc.Writers.Shared
+
+    + Add exported functions `toSuperscript` and
+      `toSubscript` (quasicomputational, #4528).
+    + Remove exported functions `metaValueToInlines`,
+      `metaValueToString`. Add new exported functions
+      `lookupMetaBool`, `lookupMetaBlocks`, `lookupMetaInlines`,
+      `lookupMetaString`. Use these whenever possible for uniformity
+      in writers (Mauro Bieg, #4907). (Note that
+      removed function `metaValueToInlines` was in previous
+      released versions.)
+    + Add `metaValueToString`.
+
+  * Text.Pandoc.Lua
+
+    + Expose more useful internals (Albert Krewinkel):
+
+      - `runFilterFile` to run a Lua filter from file;
+      - data type `Global` and its constructors; and
+      - `setGlobals` to add globals to a Lua environment.
+
+      This module also contains `Pushable` and `Peekable` instances
+      required to get pandoc's data types to and from Lua. Low-level
+      Lua operation remain hidden in Text.Pandoc.Lua.
+
+    + Rename `runPandocLua` to `runLua` (Albert Krewinkel).
+
+    + Remove `runLuaFilter`, merging this into Text.Pandoc.Filter.Lua's
+      `apply` (Albert Krewinkel).
+
+  [bug fixes and under-the-hood improvements]
+
+  * Text.Pandoc.Parsing
+
+    + Make `uri` accept any stream with Char tokens (Alexander Krotov).
+    + Rewrite `uri` without `withRaw` (Alexander Krotov).
+    + Generalize `parseFromString` and `parseFromString'` to any
+      streams with Char token (Alexander Krotov)
+    + Rewrite `nonspaceChar` using `noneOf` (Alexander Krotov)
+
+  * Text.Pandoc.Shared: Reimplement `mapLeft` using `Bifunctor.first`
+    (Alexander Krotov).
+
+  * Text.Pandoc.Pretty: Simplify `Text.Pandoc.Pretty.offset`
+    (Alexander Krotov).
+
+  * Text.Pandoc.App
+
+    + Work around HXT limitation for --syntax-definition with windows
+      drive (#4836).
+    + Always preserve tabs for man format. We need it for tables.
+
+  * Text.Pandoc.Readers.Roff: new unexported module for tokenizing
+    roff documents.
+
+  * New unexported module Text.Pandoc.RoffChar, provided character
+    escape tables for roff formats.
+
+  * Text.Pandoc.Readers.HTML: Fix `htmlTag` and `isInlineTag` to
+    accept processing instructions (#3123, regression since 2.0).
+
+  * Text.Pandoc.Readers.JATS: Use `foldl'` instead of `maximum` to
+    account for empty lists (Alexander Krotov).
+
+  * Text.Pandoc.Readers.RST: Don't allow single-dash separator in
+    headerless table (#4382).
+
+  * Text.Pandoc.Readers.Org: Parse empty argument array in inline src
+    blocks (Brian Leung).
+
+  * Text.Pandoc.Readers.Vimwiki: Get rid of `F`, `runF` and `stateMeta'`
+    in favor of `stateMeta` (Alexander Krotov).
+
+  * Text.Pandoc.Readers.LaTeX
+
+    + Allow space at end of math after `\` (#5010).
+    + Add support for `nolinkurl` command (#4992, Brian Leung).
+    + Simplified type on `doMacros'`.
+    + Tokenize before pulling tokens, rather than after (#4408). This
+      has some performance penalty but is more reliable.
+    + Make macroDef polymorphic and allow in inline context.
+      Otherwise we can't parse something like `\lowercase{\def\x{Foo}}`.
+     I have actually seen tex like this in the wild.
+    + Improved parsing of `\def`, `\let`. We now correctly parse:
+      ```
+      \def\bar{hello}
+      \let\fooi\bar
+      \def\fooii{\bar}
+      \fooi +\fooii
+
+      \def\bar{goodbye}
+      \fooi +\fooii
+      ```
+    + Improve parsing of `\def` argspec.
+    + Skip `\PackageError` commands (see #4408).
+    + Fix bugs omitting raw tex (#4527). The default is `-raw_tex`,
+      so no raw tex should result unless we explicitly say `+raw_tex`.
+      Previously some raw commands did make it through.
+    + Moved `isArgTok` to Text.Pandoc.Readers.LaTeX.Parsing.
+    + Moved `babelLangToBCP`, `polyglossiaLangToBCP` to new module,
+      Text.Pandoc.Readers.LaTeX.Lang (unexported).
+    + Simplified accent code using unicode-transforms.
+      New dependency on unicode-transforms package for normalization.
+    + Allow verbatim blocks ending with blank lines (#4624).
+    + Support `breq` math environments: `dmath`, `dgroup`, `darray`.
+      This collects some of the general-purpose code from the LaTeX reader,
+      with the aim of making the module smaller.
+
+  * Text.Pandoc.Readers.Markdown
+
+    + Fix awkward soft break movements before abbreviations (#4635).
+    + Add updateStrPos in a couple places where needed.
+
+  * Text.Pandoc.Readers.Docx: Trigger bold/italic with bCs, iCs
+    (#4947). These are variants for "complex scripts" like Arabic
+    and are now treated just like b, i (bold, italic).
+
+  * Text.Pandoc.Readers.Muse (Alexander Krotov)
+
+    + Try to parse lists before trying to parse table.
+      This ensures that tables inside lists are parsed correctly.
+    + Forbid whitespace after opening and before closing markup
+      elements.
+    + Parse page breaks.
+    + Simplify `museToPandocTable` to get rid of partial functions.
+    + Allow footnotes to start with empty line.
+    + Make sure that the whole text is parsed.
+    + Allow empty headers. Previously empty headers caused parser to
+      terminate without parsing the rest of the document.
+    + Allow examples to be indented with tabs.
+    + Remove indentation from examples indicated by `{{{` and `}}}`.
+    + Fix parsing of empty cells.
+    + Various changes to internals.
+    + Rewrite some parsers in applicative style.
+    + Avoid tagsoup dependency.
+    + Allow table caption to contain `+`.
+
+  * Text.Pandoc.Writers.LaTeX
+
+    + Add newline if math ends in a comment (#4880). This prevents the
+      closing delimiter from being swalled up in the comment.
+    + With `--listings`, don't pass through org-babel attributes (#4889).
+    + With `--biblatex`, use `\autocite` when possible (#4960).
+      `\autocites{a1}{a2}{a3}` will not collapse the entries. So, if
+      we don't have prefixes and suffixes, we use instead
+      `\autocite{a1;a2;a3}`.
+    + Fix description lists contining highlighted code (#4662).
+
+  * Text.Pandoc.Writers.Man
+
+    + Don't wrap `.SH` and `.SS` lines (#5019).
+    + Avoid unnecessary `.RS`/`.RE` pair in definition lists with
+      one paragraph definitions.
+    + Moved common groff functions to Text.Pandoc.Writers.Groff.
+    * Fix strong/code combination on man (should be `\f[CB]` not
+      `\f[BC]`, see #4973).
+    + Man writer: use `\f[R]` instead of `\f[]` to reset font
+      (Alexander Krotov, #4973).
+    + Move `splitSentences` to Text.Pandoc.Shared.
+
+  * Text.Pandoc.Writers.Docx
+
+    + Add framework for custom properties (#3034). So far, we don't
+      actually write any custom properties, but we have the
+      infrastructure to add this.
+
+    + Handle tables in table cells (#4953). Although this is not
+      documented in the spec, some versions of Word require a `w:p`
+      element inside every table cell. Thus, we add one when the
+      contents of a cell do not already include one (e.g. when a table
+      cell contains a table).
+
+  * Text.Pandoc.Writers.OpenDocument: Improve bullet/numbering
+    alignment (#4385). This change eliminates the large gap we used
+    to have between bullet and text, and also ensures that numbers
+    in numbered lists will be right-aligned.
+
+  * Text.Pandoc.Writers.ZimWiki
+
+    + Number ordered list items sequentially, rather than always
+      with 1 (#4962).
+    + Remove extra indentation on lists (#4963).
+
+  * Text.Pandoc.Writers.EPUB: Use metadata field `css` instead of
+    `stylesheet` (Mauro Bieg, #4990).
+
+  * Text.Pandoc.Writers.Markdown: Ensure blank between raw block and
+    normal content (#4629). Otherwise a raw block can prevent a
+    paragraph from being recognized as such.
+
+  * Text.Pandoc.Writers.Ms
+
+    + Removed old `escapeBar`. We don't need this now that we use
+      `@` for math delim.
+    + Moved common code to Text.Pandoc.Writers.Roff and to
+      Text.Pandoc.RoffChar.
+    + Move `splitSentences` to Text.Pandoc.Shared (to avoid duplication
+      with the man writer).
+
+   * Text.Pandoc.Writers.Muse (Alexander Krotov).
+
+    + Add support for grid tables.
+    + Fix Muse writer style.
+    + Use `length` instead of `realLength` to calculate definition
+      indentation. Muse parsers don't take character width into
+      account when calculating indentation.
+    + Do not insert newline before lists.
+    + Use lightweight markup after `</em>` tag.
+
+  * New unexported module Text.Pandoc.Writers.Roff, providing functions
+    useful for all roff format writers (man, ms).
+
+  * Text.Pandoc.Lua
+
+    + Move globals handling to separate module Text.Pandoc.Lua.Global
+      (Albert Krewinkel).
+
+    + Lua filter internals: push Shared.Element as userdata (Albert
+      Krewinkel). Hierarchical Elements were pushed to Lua as plain
+      tables. This is simple, but has the disadvantage that marshaling
+      is eager: all child elements will be marshaled as part of the
+      object. Using a Lua userdata object instead allows lazy access
+      to fields, causing content marshaling just (but also each time)
+      when a field is accessed. Filters which do not traverse the full
+      element contents tree become faster as a result.
+
+  [default template changes]
+
+  * LaTeX template: add variable hyperrefoptions(#4925, Mathias Walter).
+    Introduce a new variable `hyperrefoptions` to pass to the hyperref
+    package. This allows us (for example) to specify `hyperrefoptions:
+    linktoc=all` in a YAML block.
+
+  * revealjs template: Fix typo in the socket.io javascript plugin (#5006,
+    Yoan Blanc).
+
+  * Text.Pandoc.Lua.Util: add missing docstring to `defineHowTo`
+    (Albert Krewinkel).
+
+  * data/pandoc.lua: add datatype ListAttributes (Albert Krewinkel)
+
+  * data/sample.lua: replace custom pipe function with pandoc.utils.pipe
+    (Albert Krewinkel).
+
+  [documentation improvements]
+
+  * INSTALL.md
+
+    + Add chromeos install instructions (#4958) (Evan Pratten).
+    + Add note about TinyTeX.
+
+  * MANUAL.txt
+
+    + Change `groff` -> `roff`.
+    + Implement `--ascii` for Markdown writer.
+    + Clarify LaTeX image dimensions output (Mauro Bieg).
+
+  * doc/customizing-pandoc.md: added skeleton (Mauro Bieg, #3288).
+
+  * doc/getting-started.md: Added title to test1.md to avoid warning.
+
+  * doc/lua-filters.md: merge type references into main document,
+    fix description of Code.text (Albert Krewinkel).
+
+  [build infrastructure improvements]
+
+  * Makefile
+
+    + Makefile: added quick-cabal, full-cabal targets.
+    + Make .msi download targets insensitive to order of appveyor builds.
+
+  * Update benchmarks for ghc 8.6.1.
+
+   * pandoc.cabal:
+
+    + Enable more compiler warnings (Albert Krewinkel).
+    + Make base lower bound 4.8.
+    + Bump upper bound for QuickCheck.
+    + Bump upper bound for binary.
+    + Updated version bounds for containers and haddock-library (#4974).
+    + Added docx/docPropos/custom.xml to cabal data-files.
+    + Require skylighting 0.7.4 (#4920).
+    + New dependency on unicode-transforms package for normalization.
+
+  * Improved .travis.yml testing and test with GHC 8.6.1 (Albert Krewinkel).
+
+  * Added `tools/changelog-helper.sh`.
+
+  * Added test/grofftest.sh for testing the man reader on real man pages.
+
 pandoc (2.3.1)
 
   * RST reader: