diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,32 @@
 # Changelog for commonmark-extensions
 
+## 0.2.8
+
+  * Footnotes: don't add footnote list twice.
+    If footnoteSpec was included more than once in a SyntaxSpec
+    (e.g. `gfmExtensions <> footnoteSpec`, or `-x gfm -x footnotes`
+    on the command line), the addFootnoteList final parser ran more
+    than once, re-rendering every note and emitting a second
+    footnotes section.  We now record in `counters` that the list has
+    been added and make subsequent runs no-ops.
+
+  * Replace duplicate block specs in place (#180). When several
+    block specs have the same blockType,
+    removeDuplicateBlockSpecs still keeps the first, but now puts
+    it in the position of the last. So an extension that
+    overrides a default spec (e.g. fancy_lists' ListItem) takes
+    the default's slot, instead of moving ahead of other
+    extensions' specs and of the remaining default specs. This
+    makes task_lists work regardless of whether it is combined
+    before or after fancy_lists, and it fixes thematic breaks
+    like `* * *` being parsed as nested lists when fancy_lists is
+    enabled.
+
+  * `delimsMatch`: disallow match for 1-length delims when there is
+    no single-delim contsructor defined (e.g., with strikeout) (#181).
+
+  * Math: respect TeX percent comments (Erik Demaine).
+
 ## 0.2.7.3
 
   * Depend on commonmark 0.3.1, for the `getPrecedingTokType` export.
diff --git a/commonmark-extensions.cabal b/commonmark-extensions.cabal
--- a/commonmark-extensions.cabal
+++ b/commonmark-extensions.cabal
@@ -1,5 +1,5 @@
 name:           commonmark-extensions
-version:        0.2.7.3
+version:        0.2.8
 synopsis:       Pure Haskell commonmark parser.
 description:
    This library provides some useful extensions to core commonmark
diff --git a/src/Commonmark/Extensions/Footnote.hs b/src/Commonmark/Extensions/Footnote.hs
--- a/src/Commonmark/Extensions/Footnote.hs
+++ b/src/Commonmark/Extensions/Footnote.hs
@@ -172,6 +172,24 @@
                    (Monad m, Typeable m, Typeable bl, HasFootnote il bl,
                     IsBlock il bl) => BlockParser m il bl bl
 addFootnoteList = do
+  -- If footnoteSpec is included more than once in a SyntaxSpec,
+  -- this final parser will run more than once; only the first run
+  -- should produce a footnote list.
+  alreadyAdded <- M.member footnoteListKey . counters <$> getState
+  if alreadyAdded
+     then return mempty
+     else do
+       updateState $ \s -> s{ counters = M.insert footnoteListKey
+                                           (toDyn ()) (counters s) }
+       addFootnoteList'
+
+footnoteListKey :: Text
+footnoteListKey = "footnote:listAdded"
+
+addFootnoteList' :: forall m il bl.
+                    (Monad m, Typeable m, Typeable bl, HasFootnote il bl,
+                     IsBlock il bl) => BlockParser m il bl bl
+addFootnoteList' = do
   rm <- referenceMap <$> getState
   let keys = M.keys . unReferenceMap $ rm
   let getNote key = lookupReference key rm :: Maybe (FootnoteDef bl m)
diff --git a/src/Commonmark/Extensions/Math.hs b/src/Commonmark/Extensions/Math.hs
--- a/src/Commonmark/Extensions/Math.hs
+++ b/src/Commonmark/Extensions/Math.hs
@@ -73,6 +73,11 @@
        Symbol '\\' -> do
               tk' <- anyTok
               (tk :) . (tk' :) <$> pDollarsMath display n
+       Symbol '%' -> do
+              -- Preserve comments, including the newline, without interpreting
+              -- their braces, dollars, or backslashes.
+              comment <- restOfLine
+              (tk :) . (comment ++) <$> pDollarsMath display n
        Symbol '{' -> (tk :) <$> pDollarsMath display (n+1)
        Symbol '}' | n > 0 -> (tk :) <$> pDollarsMath display (n-1)
                   | otherwise -> mzero
diff --git a/test/fancy_lists.md b/test/fancy_lists.md
--- a/test/fancy_lists.md
+++ b/test/fancy_lists.md
@@ -296,3 +296,15 @@
 <li>a list</li>
 </ol>
 ````````````````````````````````
+
+Thematic breaks take precedence over list items, as in
+standard commonmark (#180):
+
+```````````````````````````````` example
+* * *
+
+- - -
+.
+<hr />
+<hr />
+````````````````````````````````
diff --git a/test/math.md b/test/math.md
--- a/test/math.md
+++ b/test/math.md
@@ -120,3 +120,174 @@
 <p><span class="math display">\[1\]</span>2<span class="math display">\[3\]</span></p>
 <p><span class="math display">\[1{$$2$$}3\]</span></p>
 ````````````````````````````````
+
+## TeX comments
+
+Unescaped percent signs start comments through the next newline.
+Comment text is preserved, but its braces and dollars do not affect
+math boundaries. Escaped percent signs stay literal, and backslashes
+inside comments do not escape the newline.
+
+```````````````````````````````` example
+$a%$ ignored
++b$
+.
+<p><span class="math inline">\(a%$ ignored
++b\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+${a%} $
+b}$
+.
+<p><span class="math inline">\({a%} $
+b}\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+${a%{
+b}$
+.
+<p><span class="math inline">\({a%{
+b}\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$a\%$
+.
+<p><span class="math inline">\(a\%\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+${a\%}$
+.
+<p><span class="math inline">\({a\%}\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$a\%{b$c$}$
+.
+<p><span class="math inline">\(a\%{b$c$}\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$a\\%$
+b$
+.
+<p><span class="math inline">\(a\\%$
+b\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+${a\\%}
+b}$
+.
+<p><span class="math inline">\({a\\%}
+b}\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$a\\\%$
+.
+<p><span class="math inline">\(a\\\%\)</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$a%
+% } $ \
+b$
+.
+<p><span class="math inline">\(a%
+% } $ \
+b\)</span></p>
+````````````````````````````````
+
+A delimiter inside a final comment cannot close the equation.
+
+```````````````````````````````` example
+$a%$
+.
+<p>$a%$</p>
+````````````````````````````````
+
+```````````````````````````````` example
+$$a%$$ ignored
++b$$
+.
+<p><span class="math display">\[a%$$ ignored
++b\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$${a%} $$
+b}$$
+.
+<p><span class="math display">\[{a%} $$
+b}\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$${a%{
+b}$$
+.
+<p><span class="math display">\[{a%{
+b}\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$$a\%$$
+.
+<p><span class="math display">\[a\%\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$${a\%}$$
+.
+<p><span class="math display">\[{a\%}\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$$a\%{b$$c$$}$$
+.
+<p><span class="math display">\[a\%{b$$c$$}\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$$a\\%$$
+b$$
+.
+<p><span class="math display">\[a\\%$$
+b\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$${a\\%}
+b}$$
+.
+<p><span class="math display">\[{a\\%}
+b}\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$$a\\\%$$
+.
+<p><span class="math display">\[a\\\%\]</span></p>
+````````````````````````````````
+
+```````````````````````````````` example
+$$a%
+% } $$ \
+b$$
+.
+<p><span class="math display">\[a%
+% } $$ \
+b\]</span></p>
+````````````````````````````````
+
+A delimiter inside a final comment cannot close the equation.
+
+```````````````````````````````` example
+$$a%$$
+.
+<p>$$a%$$</p>
+````````````````````````````````
diff --git a/test/strikethrough.md b/test/strikethrough.md
--- a/test/strikethrough.md
+++ b/test/strikethrough.md
@@ -48,3 +48,18 @@
 ````````````````````````````````
 
 
+
+Single tildes that can't produce strikethrough should not
+swallow intervening delimiters (#181):
+
+```````````````````````````````` example
+~4 **~75 GB.**
+.
+<p>~4 <strong>~75 GB.</strong></p>
+````````````````````````````````
+
+```````````````````````````````` example
+~~a~ ~b~~
+.
+<p><del>a~ ~b</del></p>
+````````````````````````````````
diff --git a/test/test-commonmark-extensions.hs b/test/test-commonmark-extensions.hs
--- a/test/test-commonmark-extensions.hs
+++ b/test/test-commonmark-extensions.hs
@@ -34,12 +34,16 @@
              , ("test/subscript.md", subscriptSpec)
              , ("test/pipe_tables.md", pipeTableSpec)
              , ("test/footnotes.md", footnoteSpec)
+             -- including the extension twice should be harmless:
+             , ("test/footnotes.md", footnoteSpec <> footnoteSpec)
              , ("test/math.md", mathSpec)
              , ("test/emoji.md", emojiSpec)
              , ("test/autolinks.md", autolinkSpec)
              , ("test/definition_lists.md", definitionListSpec)
              , ("test/fancy_lists.md", fancyListSpec)
              , ("test/task_lists.md", taskListSpec)
+             -- order should not matter (#180):
+             , ("test/task_lists.md", fancyListSpec <> taskListSpec)
              , ("test/attributes.md", attributesSpec)
              , ("test/raw_attribute.md", rawAttributeSpec)
              , ("test/bracketed_spans.md", bracketedSpanSpec)
