diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,35 @@
 # citeproc changelog
 
+## 0.14.1
+
+  * Stop extracting particles from given and family names.
+    citeproc.js implemented a system by which particles would
+    be extracted automatically from given and family names (so
+    that users of Zotero wouldn't have to know about the various
+    types of particles). The test suite does this unless the
+    name is enclosed in straight quotes, in which case it is
+    considered literally. We don't want this feature, because it is
+    not part of the CSL spec, and the CSL JSON files exported from
+    Zotero don't put the quotes where they would be needed for this to
+    work. However, we still remove an outer pair of quotes, in case
+    there is legacy use of this feature.
+    See discussion at jgm/pandoc#11911 .
+
+  * Record how known failures fail, instead of just that they fail. A
+    test we don't yet pass now has an `.expected` file alongside its
+    `.txt` file, containing the output we currently produce. It counts
+    as an expected failure only if its output still matches that file
+    exactly, so a change in a known-bad result is no longer silently
+    tolerated. This replaces the flat list of expected failures in
+    test/Spec.hs, five entries of which had gone stale.
+
+  * Two new test-suite options: `--accept` (re)writes the `.expected` file of
+    every failing test and removes that of every test that now passes, and
+    `--verbose` reports warnings, passes, and expected failures with diffs,
+    which are otherwise suppressed.
+
+  * Add five new tests from upstream (all passing).
+
 ## 0.14
 
   * [API change] Replace unlawful Ord Term instance with `termMatches`.
diff --git a/citeproc.cabal b/citeproc.cabal
--- a/citeproc.cabal
+++ b/citeproc.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.2
 name:                citeproc
-version:             0.14
+version:             0.14.1
 synopsis:            Generates citations and bibliography from CSL styles.
 description:         citeproc parses CSL style files and uses them to
                      generate a list of formatted citations and bibliography
@@ -21,8 +21,10 @@
                      locales/locales.json
                      test/NOTES.md
                      test/csl/*.txt
+                     test/csl/*.expected
                      test/extra/*.txt
                      test/overrides/*.txt
+                     test/overrides/*.expected
 
 source-repository    head
   type:              git
diff --git a/src/Citeproc/CslJson.hs b/src/Citeproc/CslJson.hs
--- a/src/Citeproc/CslJson.hs
+++ b/src/Citeproc/CslJson.hs
@@ -259,7 +259,7 @@
                           go ctx{ useSmallCaps = True } x <> "</span>"
       CslSup x -> "<sup>" <> go ctx x <> "</sup>"
       CslSub x -> "<sub>" <> go ctx x <> "</sub>"
-      CslBaseline x -> "<span style=\"baseline\">" <> go ctx x <> "</span>"
+      CslBaseline x -> "<span class=\"baseline\">" <> go ctx x <> "</span>"
       CslDiv t x -> "<div class=\"csl-" <> t <> "\">" <> go ctx x <> "</div>"
       CslLink t x -> "<a href=\"" <> t <> "\">" <> go ctx x <> "</a>"
       CslNoCase x -> go ctx x -- nocase is just for internal purposes
diff --git a/src/Citeproc/Types.hs b/src/Citeproc/Types.hs
--- a/src/Citeproc/Types.hs
+++ b/src/Citeproc/Types.hs
@@ -1212,10 +1212,9 @@
 instance FromJSON Name where
   parseJSON (String t) = parseCheaterName t
   parseJSON x =
-    extractParticles <$>
      (withObject "Name" $ \v -> Name
-      <$> (fmap fixApos <$> v .:? "family")
-      <*> (fmap fixApos <$> v .:? "given")
+      <$> (fmap (removeOuterQuotes . fixApos) <$> v .:? "family")
+      <*> (fmap (removeOuterQuotes . fixApos) <$> v .:? "given")
       <*> (fmap fixApos <$> v .:? "dropping-particle")
       <*> (fmap fixApos <$> v .:? "non-dropping-particle")
       <*> (fmap fixApos <$> v .:? "suffix")
@@ -1296,6 +1295,13 @@
                       c == '.'
   isParticleChar c = isLower c || isParticlePunct c
 
+removeOuterQuotes :: Text -> Text
+removeOuterQuotes t
+  | "\"" `T.isPrefixOf` t
+  , "\"" `T.isSuffixOf` t
+   = T.drop 1 $ T.dropEnd 1 t
+  | otherwise = t
+
 -- cheater syntax for name: used in parsing note:
 --  editor: Thompson || Hunter S.
 parseCheaterName :: Text -> Parser Name
@@ -1929,7 +1935,7 @@
   pCslSub = addVerticalAlign SubAlign . mconcat <$>
     (P.string "<sub>" *> P.manyTill' pCsl (P.string "</sub>"))
   pCslBaseline = addVerticalAlign BaselineAlign . mconcat <$>
-    (P.string "<span" *> pSpace *> P.string "style=\"baseline\">" *>
+    (P.string "<span" *> pSpace *> P.string "class=\"baseline\">" *>
       P.manyTill' pCsl (P.string "</span>"))
   pCslSmallCaps = addFontVariant SmallCapsVariant . mconcat <$>
     ((P.string "<span" *> pSpace *>
diff --git a/test/NOTES.md b/test/NOTES.md
--- a/test/NOTES.md
+++ b/test/NOTES.md
@@ -1,3 +1,20 @@
+## Known failures
+
+A test that we know we do not yet pass has, alongside its `.txt` file, an
+`.expected` file containing the output we currently produce (which differs
+from the test's own `RESULT` section).  Such a test counts as an expected
+failure only if its output still matches that file exactly; any other
+output is an unexpected failure and fails the suite.  A test that passes
+but still has an `.expected` file is reported as an unexpected pass, and
+the file should be deleted.
+
+By default only unexpected results are reported.  Pass `--verbose` to also
+report warnings, passes, and expected failures with their diffs.
+
+`cabal test --test-options=--accept` rewrites the `.expected` file of every
+failing test with its current output and removes the file of every test
+that now passes.  Review the resulting diff before committing it.
+
 ## Notes on failures
 
 ### test/csl/bugreports_UnisaHarvardInitialization.txt
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -7,12 +7,12 @@
 import Citeproc.CslJson
 import Data.Algorithm.DiffContext
 import System.TimeIt (timeIt)
-import Control.Monad (unless)
+import Control.Monad (unless, when)
 import Control.Monad.Trans.State
 import Control.Monad.IO.Class (liftIO)
 import System.Environment (getArgs)
 import System.Exit
-import System.Directory (getDirectoryContents, doesFileExist)
+import System.Directory (getDirectoryContents, doesFileExist, removeFile)
 import Data.Text (Text)
 import qualified Data.Set as Set
 import qualified Text.PrettyPrint as Pretty
@@ -49,6 +49,7 @@
   , citations     :: Maybe [Citation a]
   , abbreviations :: Maybe Abbreviations
   , skipReason    :: Maybe Text
+  , expectedFailure :: Maybe Text
   , options       :: Maybe TestOptions
   } deriving (Show)
 
@@ -73,9 +74,17 @@
   | Errored CiteprocError
   deriving (Show, Eq)
 
-runTest :: CiteprocTest (CslJson Text)
+-- | Command line options of the test suite itself.
+data SpecOptions =
+  SpecOptions
+  { accept  :: Bool  -- ^ record failures in .expected files
+  , verbose :: Bool  -- ^ report warnings, passes and expected failures
+  } deriving (Show)
+
+runTest :: SpecOptions
+        -> CiteprocTest (CslJson Text)
         -> StateT Counts IO TestResult
-runTest test = do
+runTest specOpts test = do
   let opts = fromMaybe defaultTestOptions . options $ test
   let cites =
         case citations test of
@@ -116,16 +125,16 @@
             let loc = mergeLocales Nothing style
             let actual = citeproc (testCiteprocOpts opts)
                            style Nothing (input test) cites
-            unless (null (resultWarnings actual)) $ do
+            when (verbose specOpts && not (null (resultWarnings actual))) $
               liftIO $ do
                 TIO.putStrLn $ "[WARNING]  " <> T.pack (path test)
                 mapM_ (TIO.putStrLn . ("==> " <>))
                      $ resultWarnings actual
             case mode test of
-              "citation" -> compareTest test
+              "citation" -> compareTest specOpts test
                   (T.intercalate "\n" $ map (renderCslJson' loc)
                                           (resultCitations actual))
-              "bibliography" -> compareTest test
+              "bibliography" -> compareTest specOpts test
                   (T.intercalate "\n"
                     (addDivs $ map (renderCslJson' loc . snd)
                                           (resultBibliography actual)))
@@ -176,28 +185,55 @@
                                  c == '[' || c == ']' || isDigit c)
 
 
-compareTest :: CiteprocTest (CslJson Text)
+compareTest :: SpecOptions
+            -> CiteprocTest (CslJson Text)
             -> Text
             -> StateT Counts IO TestResult
-compareTest test actual = do
+compareTest specOpts test actual = do
   let expected = if mode test == "citation" && isJust (citations test)
                     then removeCitationNums $ result test
                     else result test
+  let expectedFailureFile = expectedFailurePath (path test)
   if actual == expected
      then do
        modify $ \st -> st{ passed = (category test, path test) : passed st }
-       -- suppress PASSED messages
-       -- liftIO $ TIO.putStrLn $ "[PASSED] " <> path test
+       when (verbose specOpts) $
+         liftIO $ TIO.putStrLn $ "[PASSED]   " <> T.pack (path test)
+       case expectedFailure test of
+         Nothing -> return ()
+         Just _
+           | accept specOpts -> liftIO $ do
+               removeFile expectedFailureFile
+               putStrLn $ "[REMOVED]  " <> expectedFailureFile
+           | otherwise -> modify $ \st ->
+               st{ unexpectedPasses = path test : unexpectedPasses st }
        return Passed
      else do
        modify $ \st -> st{ failed = (category test, path test) : failed st }
-       liftIO $ do
-         TIO.putStrLn $ (if path test `elem` expectedFailures
-                            then "[FAILED:EXPECTED] "
-                            else "[FAILED:UNEXPECTED] ") <> T.pack (path test)
-         showDiff expected actual
+       if expectedFailure test == Just actual
+          then when (verbose specOpts) $ liftIO $ do
+                 TIO.putStrLn $ "[FAILED:EXPECTED] " <> T.pack (path test)
+                 showDiff expected actual
+          else if accept specOpts
+                  then liftIO $ do
+                    TIO.writeFile expectedFailureFile (actual <> "\n")
+                    putStrLn $ "[ACCEPTED] " <> expectedFailureFile
+                  else do
+                    modify $ \st ->
+                      st{ unexpectedFailures =
+                            path test : unexpectedFailures st }
+                    liftIO $ do
+                      TIO.putStrLn $
+                        "[FAILED:UNEXPECTED] " <> T.pack (path test)
+                      showDiff expected actual
        return $ Failed actual expected
 
+-- A test that is known to fail has, alongside its .txt file, an .expected
+-- file containing the output we currently produce.  The failure counts as
+-- an expected failure only if the output still matches this file exactly.
+expectedFailurePath :: FilePath -> FilePath
+expectedFailurePath fp = fp -<.> ".expected"
+
 splitSections :: ByteString -> [(Text, ByteString)]
 splitSections = snd . foldl' go startingState . B.lines . removeBOM
  where
@@ -234,6 +270,13 @@
     if exists
        then Just <$> TIO.readFile (fp <> ".skip")
        else return Nothing
+  expectedFail <- do
+    let expectedFp = expectedFailurePath fp
+    exists <- doesFileExist expectedFp
+    if exists
+       -- the file has a final newline, the test output does not
+       then Just . T.dropWhileEnd (== '\n') <$> TIO.readFile expectedFp
+       else return Nothing
   return CiteprocTest
     { name = T.pack $ dropExtension $ takeBaseName fp
     , path = fp
@@ -254,6 +297,7 @@
     , abbreviations = fromJSON "ABBREVIATIONS" <$>
                      lookup "abbreviations" sections
     , skipReason = reason
+    , expectedFailure = expectedFail
     , options = fromJSON "TESTOPTIONS" <$> lookup "options" sections
     }
 
@@ -281,12 +325,18 @@
 main :: IO ()
 main = do
   args <- getArgs
+  -- with --accept, the .expected file of every failing test is (re)written
+  -- with its current output, and that of every passing test is removed;
+  -- with --verbose, passes and expected failures are reported too
+  let specOpts = SpecOptions{ accept  = "--accept" `elem` args
+                            , verbose = "--verbose" `elem` args }
+  let patterns = filter (`notElem` ["--accept", "--verbose"]) args
   let matchesPattern x =
         takeExtension x == ".txt" &&
-        case args of
+        case patterns of
           [] -> True
-          _  -> any (\arg -> map toLower arg `isInfixOf` map toLower x) args
-  overrides <- if any ('/' `elem`) args
+          _  -> any (\arg -> map toLower arg `isInfixOf` map toLower x) patterns
+  overrides <- if any ('/' `elem`) patterns
                   then return []
                   else filter matchesPattern <$>
                           getDirectoryContents overrideDir
@@ -295,8 +345,8 @@
                      then overrideDir </> fp
                      else testDir </> fp
 
-  testFiles <- if any ('/' `elem`) args
-                  then return args
+  testFiles <- if any ('/' `elem`) patterns
+                  then return patterns
                   else do
                     cslTests <- map addDir . filter matchesPattern
                                  <$> getDirectoryContents testDir
@@ -307,11 +357,13 @@
 
   testCases <- sortOn name <$> mapM loadTestCase testFiles
   (_,counts) <- timeIt $
-                 runStateT (mapM_ runTest testCases)
+                 runStateT (mapM_ (runTest specOpts) testCases)
                            Counts{ failed   = []
                                  , errored  = []
                                  , passed   = []
-                                 , skipped  = [] }
+                                 , skipped  = []
+                                 , unexpectedFailures = []
+                                 , unexpectedPasses   = [] }
   putStrLn ""
   let categories = sort $ Set.toList
                         $ foldr (Set.insert . category) mempty testCases
@@ -343,23 +395,19 @@
                (length (failed counts))
                (length (errored counts))
                (length (skipped counts))
-  let unexpectedFailures =
-        filter ((`notElem` expectedFailures) . snd) (failed counts)
-  let unexpectedPasses =
-        filter ((`elem` expectedFailures) . snd) (passed counts)
-  unless (null unexpectedFailures) $ do
+  unless (null (unexpectedFailures counts)) $ do
     putStrLn ""
     putStrLn "Unexpected failures"
     putStrLn "-------------------"
-    mapM_ (putStrLn . snd) unexpectedFailures
+    mapM_ putStrLn (unexpectedFailures counts)
     putStrLn ""
-  unless (null unexpectedPasses) $ do
+  unless (null (unexpectedPasses counts)) $ do
     putStrLn ""
     putStrLn "Unexpected passes"
     putStrLn "-----------------"
-    mapM_ (putStrLn . snd) unexpectedPasses
+    mapM_ putStrLn (unexpectedPasses counts)
     putStrLn ""
-  case length unexpectedFailures + length (errored counts) of
+  case length (unexpectedFailures counts) + length (errored counts) of
     0 -> do
       putStrLn "(All failures were expected failures.)"
       exitSuccess
@@ -371,6 +419,8 @@
     , errored  :: [(Text,FilePath)]
     , passed   :: [(Text,FilePath)]
     , skipped  :: [(Text,FilePath)]
+    , unexpectedFailures :: [FilePath]  -- failed, but not as recorded
+    , unexpectedPasses   :: [FilePath]  -- passed, though a failure was recorded
     } deriving (Show)
 
 showDiff :: Text -> Text -> IO ()
@@ -385,70 +435,3 @@
     (Pretty.text "actual")
     (Pretty.text . T.unpack . unnumber)
     $ getContextDiff Nothing (T.lines expected) (T.lines actual)
-
-expectedFailures :: [FilePath]
-expectedFailures = [
-  "test/csl/bugreports_OverwriteCitationItems.txt",
-  "test/csl/bugreports_SingleQuoteXml.txt",
-  "test/csl/bugreports_SmallCapsEscape.txt",
-  "test/csl/bugreports_SortedIeeeItalicsFail.txt",
-  "test/csl/bugreports_ikeyOne.txt",
-  "test/csl/date_NegativeDateSort.txt",
-  "test/csl/date_NegativeDateSortViaMacro.txt",
-  "test/csl/date_NegativeDateSortViaMacroOnYearMonthOnly.txt",
-  "test/csl/date_YearSuffixImplicitWithNoDate.txt",
-  "test/csl/date_YearSuffixWithNoDate.txt",
-  "test/csl/disambiguate_DifferentSpacingInInitials.txt",
-  "test/csl/disambiguate_DisambiguationHang.txt",
-  "test/csl/disambiguate_IncrementalExtraText.txt",
-  "test/csl/disambiguate_InitializeWithButNoDisambiguation.txt",
-  "test/csl/disambiguate_YearCollapseWithInstitution.txt",
-  "test/csl/disambiguate_YearSuffixAtTwoLevels.txt",
-  "test/csl/disambiguate_YearSuffixWithEtAlSubequent.txt",
-  "test/csl/disambiguate_YearSuffixWithEtAlSubsequent.txt",
-  "test/csl/flipflop_LeadingMarkupWithApostrophe.txt",
-  "test/csl/flipflop_OrphanQuote.txt",
-  "test/overrides/fullstyles_ABdNT.txt",
-  "test/csl/integration_FirstReferenceNoteNumberPositionChange.txt",
-  "test/csl/integration_IbidOnInsert.txt",
-  "test/csl/magic_CapitalizeFirstOccurringTerm.txt",
-  "test/csl/magic_PunctuationInQuoteNested.txt",
-  "test/csl/magic_SubsequentAuthorSubstituteNotFooled.txt",
-  "test/csl/magic_TermCapitalizationWithPrefix.txt",
-  "test/csl/name_CiteGroupDelimiterWithYearSuffixCollapse2.txt",
-  "test/csl/name_EtAlWithCombined.txt",
-  "test/csl/name_HebrewAnd.txt",
-  "test/csl/name_InTextMarkupInitialize.txt",
-  "test/csl/name_InTextMarkupNormalizeInitials.txt",
-  "test/csl/number_OrdinalSpacing.txt",
-  "test/csl/number_PlainHyphenOrEnDashAlwaysPlural.txt",
-  "test/csl/position_FirstTrueOnlyOnce.txt",
-  "test/csl/position_IbidInText.txt",
-  "test/csl/position_IbidSeparateCiteSameNote.txt",
-  "test/csl/position_IbidWithLocator.txt",
-  "test/csl/position_IbidWithMultipleSoloCitesInBackref.txt",
-  "test/csl/position_IfIbidWithLocatorIsTrueThenIbidIsTrue.txt",
-  "test/csl/position_NearNoteSameNote.txt",
-  "test/csl/position_ResetNoteNumbers.txt",
-  "test/csl/punctuation_FullMontyQuotesIn.txt",
-  "test/csl/quotes_QuotesUnderQuotesFalse.txt",
-  "test/csl/sort_BibliographyCitationNumberDescending.txt",
-  "test/csl/sort_BibliographyCitationNumberDescendingViaCompositeMacro.txt",
-  "test/csl/sort_BibliographyCitationNumberDescendingViaMacro.txt",
-  "test/csl/sort_LeadingApostropheOnNameParticle.txt",
-  "test/csl/sort_OmittedBibRefMixedNumericStyle.txt",
-  "test/csl/sort_OmittedBibRefNonNumericStyle.txt",
-  "test/csl/sort_RangeUnaffected.txt",
-  "test/csl/substitute_SubstituteOnlyOnceTermEmpty.txt",
-  "test/csl/bugreports_NoCaseEscape.txt",
-  "test/csl/bugreports_LegislationCrash.txt",
-  "test/csl/bugreports_EnvAndUrb.txt",
-  "test/csl/bugreports_DemoPageFullCiteCruftOnSubsequent.txt",
-  "test/csl/bugreports_ChicagoAuthorDateLooping.txt",
-  "test/csl/bugreports_AutomaticallyDeleteItemsFails.txt",
-  "test/csl/affix_WithCommas.txt",
-  "test/csl/affix_CommaAfterQuote.txt",
-  "test/overrides/flipflop_NumericField.txt",
-  "test/csl/testers_SecondAutoGeneratedZoteroPluginTest.txt",
-  "test/csl/testers_FirstAutoGeneratedZoteroPluginTest.txt"
-  ]
diff --git a/test/csl/affix_CommaAfterQuote.expected b/test/csl/affix_CommaAfterQuote.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/affix_CommaAfterQuote.expected
@@ -0,0 +1,1 @@
+“quote,” Hello Thing
diff --git a/test/csl/affix_WithCommas.expected b/test/csl/affix_WithCommas.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/affix_WithCommas.expected
@@ -0,0 +1,3 @@
+John Smith, <i>Book C</i>, 2000, and David Jones, <i>Book D</i>, 2000.
+Smith, <i>Book C</i> is one source,; Jones, <i>Book D</i> is another.
+Smith, <i>Book C</i>, 23 is one source,; Jones, <i>Book D</i> is another.
diff --git a/test/csl/bugreports_AutomaticallyDeleteItemsFails.expected b/test/csl/bugreports_AutomaticallyDeleteItemsFails.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_AutomaticallyDeleteItemsFails.expected
@@ -0,0 +1,11 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">
+    <div class="csl-left-margin">[1]</div><div class="csl-right-inline"> J. Doe, <i>Book A</i>, 2000.</div>
+  </div>
+  <div class="csl-entry">
+    <div class="csl-left-margin">[2]</div><div class="csl-right-inline"> J. Doe, <i>Book B</i>, 2000.</div>
+  </div>
+  <div class="csl-entry">
+    <div class="csl-left-margin">[3]</div><div class="csl-right-inline"> R. Snoakes, <i>Book C</i>, 2000.</div>
+  </div>
+</div>
diff --git a/test/csl/bugreports_ChicagoAuthorDateLooping.expected b/test/csl/bugreports_ChicagoAuthorDateLooping.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_ChicagoAuthorDateLooping.expected
@@ -0,0 +1,1 @@
+(Manstein 1982; Anon.; Anon.)
diff --git a/test/csl/bugreports_DemoPageFullCiteCruftOnSubsequent.expected b/test/csl/bugreports_DemoPageFullCiteCruftOnSubsequent.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_DemoPageFullCiteCruftOnSubsequent.expected
@@ -0,0 +1,1 @@
+Nolan J. Malone, U.S. Bureau of the Census, <i>Evaluating Components of International Migration: Consistency of 2000 Nativity Data</i> (New York: Routledge, 2001).
diff --git a/test/csl/bugreports_EnvAndUrb.expected b/test/csl/bugreports_EnvAndUrb.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_EnvAndUrb.expected
@@ -0,0 +1,3 @@
+Baines, T S, O Benedettini and J M Kay, ‘Title One’; Baines, T S, F Gump and J M Kay, ‘Title Two’.
+See reference 1, Baines et al., ‘Title One’.
+See reference 1, Baines et al., ‘Title Two’.
diff --git a/test/csl/bugreports_LegislationCrash.expected b/test/csl/bugreports_LegislationCrash.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_LegislationCrash.expected
@@ -0,0 +1,3 @@
+<div class="csl-bib-body">
+  <div class="csl-entry"><i>Arrêté du 23 mars 1992 relatif au programme des études conduisant au diplôme d’État d’infirmier</i>, 1992.</div>
+</div>
diff --git a/test/csl/bugreports_NoCaseEscape.expected b/test/csl/bugreports_NoCaseEscape.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_NoCaseEscape.expected
@@ -0,0 +1,8 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">
+    <div class="csl-block">Aalto, Alan</div><div class="csl-left-margin"> N.d.a</div><div class="csl-right-inline">“‘PIAAC-Longitudinal (PIAAC-L) 2015.’”</div>
+  </div>
+  <div class="csl-entry">
+    <div class="csl-left-margin"> N.d.b</div><div class="csl-right-inline">“PIAAC-Longitudinal (PIAAC-Lx) 2015”.</div>
+  </div>
+</div>
diff --git a/test/csl/bugreports_OverwriteCitationItems.expected b/test/csl/bugreports_OverwriteCitationItems.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_OverwriteCitationItems.expected
@@ -0,0 +1,2 @@
+Title Two; Title Three
+Title Four; Title Five
diff --git a/test/csl/bugreports_SingleQuoteXml.expected b/test/csl/bugreports_SingleQuoteXml.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_SingleQuoteXml.expected
@@ -0,0 +1,1 @@
+[Cite with a composer ; O A. “hello” <i>Book Title</i>]
diff --git a/test/csl/bugreports_SmallCapsEscape.expected b/test/csl/bugreports_SmallCapsEscape.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_SmallCapsEscape.expected
@@ -0,0 +1,5 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">
+    <div class="csl-block">Aalto, Alan</div><div class="csl-left-margin"> N.d.</div><div class="csl-right-inline"><span style="font-variant:small-caps;">Here</span>.</div>
+  </div>
+</div>
diff --git a/test/csl/bugreports_SortedIeeeItalicsFail.txt b/test/csl/bugreports_SortedIeeeItalicsFail.txt
--- a/test/csl/bugreports_SortedIeeeItalicsFail.txt
+++ b/test/csl/bugreports_SortedIeeeItalicsFail.txt
@@ -7,13 +7,13 @@
 >>===== RESULT =====>>
 <div class="csl-bib-body">
   <div class="csl-entry">
-    <div class="csl-left-margin">[1]</div><div class="csl-right-inline"> J. Doe, “His Anonymous Article,” <i>Journal of Obscurity</i>, vol. 100, p. 15, Jun. 1965.</div>
+    <div class="csl-left-margin">[1]</div><div class="csl-right-inline"> J. Doe, “His Anonymous Article,” <i>Journal of Obscurity</i>, vol. 100, p. 15, June. 1965.</div>
   </div>
   <div class="csl-entry">
-    <div class="csl-left-margin">[2]</div><div class="csl-right-inline"> G. Everhardt, “His Anonymous Article,” <i>Journal of Obscurity</i>, vol. 100, p. 15, Jun. 1965.</div>
+    <div class="csl-left-margin">[2]</div><div class="csl-right-inline"> G. Everhardt, “His Anonymous Article,” <i>Journal of Obscurity</i>, vol. 100, p. 15, June. 1965.</div>
   </div>
   <div class="csl-entry">
-    <div class="csl-left-margin">[3]</div><div class="csl-right-inline"> J. Roe, “His Anonymous Article,” <i>Journal of Obscurity</i>, vol. 100, p. 15, Jun. 1965.</div>
+    <div class="csl-left-margin">[3]</div><div class="csl-right-inline"> J. Roe, “His Anonymous Article,” <i>Journal of Obscurity</i>, vol. 100, p. 15, June. 1965.</div>
   </div>
 </div>
 <<===== RESULT =====<<
@@ -369,4 +369,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/bugreports_ikeyOne.expected b/test/csl/bugreports_ikeyOne.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_ikeyOne.expected
@@ -0,0 +1,2 @@
+(John Smith)
+(James Smith)
diff --git a/test/csl/bugreports_parseName.expected b/test/csl/bugreports_parseName.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/bugreports_parseName.expected
@@ -0,0 +1,4 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">van Happel, Eduard 2008</div>
+  <div class="csl-entry">von Hoppel, Gustav 2008</div>
+</div>
diff --git a/test/csl/date_NegativeDateSort.txt b/test/csl/date_NegativeDateSort.txt
--- a/test/csl/date_NegativeDateSort.txt
+++ b/test/csl/date_NegativeDateSort.txt
@@ -9,12 +9,12 @@
 (whether ascending or descending).
 
 >>===== RESULT =====>>
-100BC-7-13, 44BC-3-15, 54AD-10-13, 68AD-6-11
+100 BC-7-13, 44 BC-3-15, 54 AD-10-13, 68 AD-6-11
 <<===== RESULT =====<<
 
 
 >>===== CSL =====>>
-<style 
+<style
       xmlns="http://purl.org/net/xbiblio/csl"
       class="note"
       version="1.0">
@@ -104,4 +104,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/date_NegativeDateSortViaMacro.txt b/test/csl/date_NegativeDateSortViaMacro.txt
--- a/test/csl/date_NegativeDateSortViaMacro.txt
+++ b/test/csl/date_NegativeDateSortViaMacro.txt
@@ -9,12 +9,12 @@
 (whether ascending or descending).
 
 >>===== RESULT =====>>
-100BC-7-13, 44BC-3-15, 54AD-10-13, 68AD-6-11
+100 BC-7-13, 44 BC-3-15, 54 AD-10-13, 68 AD-6-11
 <<===== RESULT =====<<
 
 
 >>===== CSL =====>>
-<style 
+<style
       xmlns="http://purl.org/net/xbiblio/csl"
       class="note"
       version="1.0">
@@ -107,4 +107,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/date_NegativeDateSortViaMacroOnYearMonthOnly.txt b/test/csl/date_NegativeDateSortViaMacroOnYearMonthOnly.txt
--- a/test/csl/date_NegativeDateSortViaMacroOnYearMonthOnly.txt
+++ b/test/csl/date_NegativeDateSortViaMacroOnYearMonthOnly.txt
@@ -9,12 +9,12 @@
 (whether ascending or descending).
 
 >>===== RESULT =====>>
-BookX (100BC-7-14), BookY (100BC-7-13), BookA (68AD-3-16), BookB (68AD-3-15)
+BookX (100 BC-7-14), BookY (100 BC-7-13), BookA (68 AD-3-16), BookB (68 AD-3-15)
 <<===== RESULT =====<<
 
 
 >>===== CSL =====>>
-<style 
+<style
       xmlns="http://purl.org/net/xbiblio/csl"
       class="note"
       version="1.0">
@@ -117,4 +117,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/date_VariousInvalidDates.txt b/test/csl/date_VariousInvalidDates.txt
--- a/test/csl/date_VariousInvalidDates.txt
+++ b/test/csl/date_VariousInvalidDates.txt
@@ -3,14 +3,33 @@
 <<===== MODE =====<<
 
 
+>>==== DESCRIPTION ====>>
 
+This depends on correct handling of seasons expressed in month parts per the
+discussion at
+https://discourse.citationstyles.org/t/edtf-and-date-representation/1663
+
+Additionally, it depends on further, special handling for month values 17 and
+18 per the code comment at
+
+https://github.com/Juris-M/citeproc-js/blob/master/src/node_datepart.js#L249
+
+which describes seasons derived from months "with a value of 13, 14, 15, 16,
+or (to allow correct ranging with Down Under dates) 17 or 18."
+
+This test is also described in
+https://github.com/zotero/citeproc-rs/blob/master/crates/citeproc/tests/data/snapshot.txt#L60
+
+<<==== DESCRIPTION ====<<
+
+
 >>===== RESULT =====>>
 Date: (); Date: (Spring); Date: (Spring); Date: (); Date: (Winter)
 <<===== RESULT =====<<
 
 
 >>===== CSL =====>>
-<style 
+<style
       xmlns="http://purl.org/net/xbiblio/csl"
       class="note"
       version="1.0">
@@ -106,4 +125,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/date_YearSuffixImplicitWithNoDate.expected b/test/csl/date_YearSuffixImplicitWithNoDate.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/date_YearSuffixImplicitWithNoDate.expected
@@ -0,0 +1,1 @@
+(John Doe n.d. [Accessed: June 1, 1965]; John Doe n.d. [Accessed: June 1, 2065])
diff --git a/test/csl/date_YearSuffixWithNoDate.expected b/test/csl/date_YearSuffixWithNoDate.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/date_YearSuffixWithNoDate.expected
@@ -0,0 +1,1 @@
+(John Doe n.d. [Accessed: June 1, 1965]; John Doe n.d. [Accessed: June 1, 2065])
diff --git a/test/csl/decorations_Baseline.txt b/test/csl/decorations_Baseline.txt
--- a/test/csl/decorations_Baseline.txt
+++ b/test/csl/decorations_Baseline.txt
@@ -6,13 +6,13 @@
 
 >>== RESULT ==>>
 <div class="csl-bib-body">
-  <div class="csl-entry"><sup>Little, Stuart, <span style="baseline">My Short Narrative</span> (1990)</sup></div>
+  <div class="csl-entry"><sup>Little, Stuart, <span class="baseline">My Short Narrative</span> (1990)</sup></div>
 </div>
 <<== RESULT ==<<
 
 
 >>===== CSL =====>>
-<style 
+<style
       xmlns="http://purl.org/net/xbiblio/csl"
       class="note"
       version="1.0">
@@ -70,4 +70,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/disambiguate_CitationLabelInData.expected b/test/csl/disambiguate_CitationLabelInData.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_CitationLabelInData.expected
@@ -0,0 +1,1 @@
+SpiffLabel1900a; SpiffLabel1900b; Bron00; BrCh98; vEFG26
diff --git a/test/csl/disambiguate_DifferentSpacingInInitials.expected b/test/csl/disambiguate_DifferentSpacingInInitials.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_DifferentSpacingInInitials.expected
@@ -0,0 +1,1 @@
+Doe, J. J., His Anonymous Life (part 1); Doe, J. J., His Anonymous Life (part 2)
diff --git a/test/csl/disambiguate_DisambiguationHang.expected b/test/csl/disambiguate_DisambiguationHang.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_DisambiguationHang.expected
@@ -0,0 +1,3 @@
+(Caminiti, Johnson, Burnod, Galli, &#38; Ferraina 1990a)
+(Caminiti, Johnson, Burnod, Galli, &#38; Ferraina 1990b)
+(Caminiti, Johnson, &#38; Urbano 1990a)
diff --git a/test/csl/disambiguate_IncrementalExtraText.expected b/test/csl/disambiguate_IncrementalExtraText.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_IncrementalExtraText.expected
@@ -0,0 +1,5 @@
+Yost Trisk
+John Smith, Book One, ed. 3
+John Smith, Book Two, ed. 4
+John Smith, Complete Works, ed. 5
+John Smith, Complete Works, ed. 6
diff --git a/test/csl/disambiguate_InitializeWithButNoDisambiguation.expected b/test/csl/disambiguate_InitializeWithButNoDisambiguation.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_InitializeWithButNoDisambiguation.expected
@@ -0,0 +1,1 @@
+(Doe, 1965b; Doe, 1965a)
diff --git a/test/csl/disambiguate_SkipAccessedYearSuffix.txt b/test/csl/disambiguate_SkipAccessedYearSuffix.txt
--- a/test/csl/disambiguate_SkipAccessedYearSuffix.txt
+++ b/test/csl/disambiguate_SkipAccessedYearSuffix.txt
@@ -13,7 +13,7 @@
 
 
 >>===== CSL =====>>
-<style 
+<style
       xmlns="http://purl.org/net/xbiblio/csl"
       class="note"
       version="1.0">
@@ -29,8 +29,8 @@
     </names>
   </macro>
   <macro name="publisher">
-    <text variable="publisher" suffix=", "/>       
-    <text variable="publisher-place" suffix=", "/>     
+    <text variable="publisher" suffix=", "/>
+    <text variable="publisher-place" suffix=", "/>
     <text macro="date"/>
   </macro>
   <macro name="date">
@@ -104,7 +104,8 @@
   <!--   formatting citation      -->
   <citation et-al-min="3" et-al-use-first="1" disambiguate-add-year-suffix="true" collapse="year">
     <layout>
-      <text value="BOGUS"/>
+      <text macro="title" suffix=". "/>
+      <text macro="publisher"/>
     </layout>
   </citation>
   <!--   formatting bibliography      -->
@@ -193,4 +194,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/disambiguate_YearCollapseWithInstitution.expected b/test/csl/disambiguate_YearCollapseWithInstitution.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_YearCollapseWithInstitution.expected
@@ -0,0 +1,3 @@
+(Smith Co 2000a, 2000b, 2000c)
+(Smith Co 2000b)
+(Smith Co 2000c)
diff --git a/test/csl/disambiguate_YearSuffixAtTwoLevels.expected b/test/csl/disambiguate_YearSuffixAtTwoLevels.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_YearSuffixAtTwoLevels.expected
@@ -0,0 +1,1 @@
+Smith et al. (1986a); Smith et al. (1986b); Smith et al. (1986c); Smith et al. (1986d)
diff --git a/test/csl/disambiguate_YearSuffixWithEtAlSubequent.expected b/test/csl/disambiguate_YearSuffixWithEtAlSubequent.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_YearSuffixWithEtAlSubequent.expected
@@ -0,0 +1,3 @@
+(Smith 2000a, 2000b, 2000c)
+(Smith 2000b)
+(Smith 2000c)
diff --git a/test/csl/disambiguate_YearSuffixWithEtAlSubsequent.expected b/test/csl/disambiguate_YearSuffixWithEtAlSubsequent.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/disambiguate_YearSuffixWithEtAlSubsequent.expected
@@ -0,0 +1,3 @@
+(Smith 2000a, 2000b, 2000c)
+(Smith 2000b)
+(Smith 2000c)
diff --git a/test/csl/flipflop_LeadingMarkupWithApostrophe.expected b/test/csl/flipflop_LeadingMarkupWithApostrophe.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/flipflop_LeadingMarkupWithApostrophe.expected
@@ -0,0 +1,1 @@
+<i>Insha’Allah</i> is an Arabic phrase meaning “God willing.” Another Arabic word is <i>bukra</i>. Aalto
diff --git a/test/csl/flipflop_OrphanQuote.expected b/test/csl/flipflop_OrphanQuote.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/flipflop_OrphanQuote.expected
@@ -0,0 +1,1 @@
+Nation of “Positive Obligations ” of State Under the European Convention on Human Rights (1)
diff --git a/test/csl/integration_FirstReferenceNoteNumberPositionChange.expected b/test/csl/integration_FirstReferenceNoteNumberPositionChange.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/integration_FirstReferenceNoteNumberPositionChange.expected
@@ -0,0 +1,5 @@
+Doe, “Life of Doe” (1901).
+Roe, “Life of Roe” (1900).
+Doe, supra note 1.
+Roe, supra note 2.
+Snoakes, “Life of Snoakes” (1902).
diff --git a/test/csl/integration_IbidOnInsert.expected b/test/csl/integration_IbidOnInsert.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/integration_IbidOnInsert.expected
@@ -0,0 +1,4 @@
+(Doe p. 12)
+(Noakes p. 34)
+(Snoakes p. 45)
+(ibid.)
diff --git a/test/csl/magic_CapitalizeFirstOccurringTerm.expected b/test/csl/magic_CapitalizeFirstOccurringTerm.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/magic_CapitalizeFirstOccurringTerm.expected
@@ -0,0 +1,1 @@
+and
diff --git a/test/csl/magic_NameSuffixNoComma.expected b/test/csl/magic_NameSuffixNoComma.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/magic_NameSuffixNoComma.expected
@@ -0,0 +1,1 @@
+John, III Doe
diff --git a/test/csl/magic_NameSuffixWithComma.expected b/test/csl/magic_NameSuffixWithComma.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/magic_NameSuffixWithComma.expected
@@ -0,0 +1,1 @@
+John,! Jr. Doe
diff --git a/test/csl/magic_PunctuationInQuoteNested.expected b/test/csl/magic_PunctuationInQuoteNested.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/magic_PunctuationInQuoteNested.expected
@@ -0,0 +1,1 @@
+Doe. <i>“Book A”</i>. 1900.
diff --git a/test/csl/magic_SubsequentAuthorSubstituteNotFooled.txt b/test/csl/magic_SubsequentAuthorSubstituteNotFooled.txt
--- a/test/csl/magic_SubsequentAuthorSubstituteNotFooled.txt
+++ b/test/csl/magic_SubsequentAuthorSubstituteNotFooled.txt
@@ -6,7 +6,7 @@
 
 >>===== RESULT =====>>
 <div class="csl-bib-body">
-  <div class="csl-entry">Silverstein, Theodore, tran. “Sir Gawain and the Green Knight.” Chicago: University of Chicago Press, 1974.</div>
+  <div class="csl-entry">Silverstein, Theodore, trans. “Sir Gawain and the Green Knight.” Chicago: University of Chicago Press, 1974.</div>
   <div class="csl-entry">Soltes, Ori A., ed. “Georgia: Art and Civilization through the Ages.” London: Philip Wilson, 1999.</div>
   <div class="csl-entry">“The Chicago Manual of Style.” Chicago: University of Chicago Press, 1993.</div>
 </div>
@@ -433,7 +433,7 @@
     <text suffix=" " variable="title" />
     <text variable="genre" />
   </macro>
-  <citation 
+  <citation
          disambiguate-add-names="true"
          et-al-min="4"
          et-al-subsequent-min="4"
@@ -460,7 +460,7 @@
       </choose>
     </layout>
   </citation>
-  <bibliography 
+  <bibliography
          entry-spacing="0"
          et-al-min="11"
          et-al-use-first="7"
@@ -557,4 +557,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/magic_TermCapitalizationWithPrefix.expected b/test/csl/magic_TermCapitalizationWithPrefix.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/magic_TermCapitalizationWithPrefix.expected
@@ -0,0 +1,4 @@
+Doe (1965)
+See ibid.
+This has been said. Ibid.
+ibid.
diff --git a/test/csl/name_CiteGroupDelimiterWithYearSuffixCollapse2.expected b/test/csl/name_CiteGroupDelimiterWithYearSuffixCollapse2.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_CiteGroupDelimiterWithYearSuffixCollapse2.expected
@@ -0,0 +1,1 @@
+(Aalto 2015a–e; Bartleby 2010)
diff --git a/test/csl/name_EtAlWithCombined.expected b/test/csl/name_EtAlWithCombined.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_EtAlWithCombined.expected
@@ -0,0 +1,5 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">John Doe。</div>
+  <div class="csl-entry">——，Ziggy Zither 等點校。</div>
+  <div class="csl-entry">田中太郎, Yossarian Yoda, 等翻譯員。</div>
+</div>
diff --git a/test/csl/name_HebrewAnd.expected b/test/csl/name_HebrewAnd.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_HebrewAnd.expected
@@ -0,0 +1,1 @@
+תפוח ו  תפוז
diff --git a/test/csl/name_HyphenatedNonDroppingParticle1.expected b/test/csl/name_HyphenatedNonDroppingParticle1.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_HyphenatedNonDroppingParticle1.expected
@@ -0,0 +1,5 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">al-One, Alan</div>
+  <div class="csl-entry">Marple, Mary</div>
+  <div class="csl-entry">Participle, Paul</div>
+</div>
diff --git a/test/csl/name_HyphenatedNonDroppingParticle2.expected b/test/csl/name_HyphenatedNonDroppingParticle2.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_HyphenatedNonDroppingParticle2.expected
@@ -0,0 +1,5 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">Alan al-One</div>
+  <div class="csl-entry">Mary Marple</div>
+  <div class="csl-entry">Paul Participle</div>
+</div>
diff --git a/test/csl/name_InTextMarkupInitialize.expected b/test/csl/name_InTextMarkupInitialize.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_InTextMarkupInitialize.expected
@@ -0,0 +1,4 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">&#60;b&#62;Doe&#60;/b&#62;, &#60;b&#62;John&#60;/b&#62;. Q.</div>
+  <div class="csl-entry">&#60;b&#62;Doe&#60;/b&#62;, &#60;b&#62;John&#60;/b&#62;.-Q.</div>
+</div>
diff --git a/test/csl/name_InTextMarkupNormalizeInitials.expected b/test/csl/name_InTextMarkupNormalizeInitials.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_InTextMarkupNormalizeInitials.expected
@@ -0,0 +1,4 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">&#60;b&#62;Doe&#60;/b&#62;, &#60;b&#62;J&#60;/b&#62;. Q.</div>
+  <div class="csl-entry">&#60;b&#62;Doe&#60;/b&#62;, &#60;b&#62;J&#60;/b&#62;.-Q.</div>
+</div>
diff --git a/test/csl/name_ParseNames.expected b/test/csl/name_ParseNames.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_ParseNames.expected
@@ -0,0 +1,1 @@
+Humboldt, Alexander von; van der Vlist, Eric; van Gogh, Vincent
diff --git a/test/csl/name_ParsedDroppingParticleWithApostrophe.expected b/test/csl/name_ParsedDroppingParticleWithApostrophe.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_ParsedDroppingParticleWithApostrophe.expected
@@ -0,0 +1,1 @@
+François Hédelin d’(Aubignac)
diff --git a/test/csl/name_ParsedNonDroppingParticleWithApostrophe.expected b/test/csl/name_ParsedNonDroppingParticleWithApostrophe.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_ParsedNonDroppingParticleWithApostrophe.expected
@@ -0,0 +1,1 @@
+<span style="font-variant:small-caps;">d’Aubignac</span> (François Hédelin)
diff --git a/test/csl/name_ParticleCaps3.expected b/test/csl/name_ParticleCaps3.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_ParticleCaps3.expected
@@ -0,0 +1,5 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">Onename van One, Twoname van Two</div>
+  <div class="csl-entry">Threename van Three, Fourname Van Four</div>
+  <div class="csl-entry">Dick Van Dyke</div>
+</div>
diff --git a/test/csl/name_ParticleCaps3.txt b/test/csl/name_ParticleCaps3.txt
--- a/test/csl/name_ParticleCaps3.txt
+++ b/test/csl/name_ParticleCaps3.txt
@@ -6,7 +6,7 @@
 <div class="csl-bib-body">
   <div class="csl-entry">Onename van One, Twoname van Two</div>
   <div class="csl-entry">Threename van Three, Fourname Van Four</div>
-  <div class="csl-entry">Dick Van Dyke</div>
+  <div class="csl-entry">Dick "Van Dyke"</div>
 </div>
 <<==== RESULT ====<<
 
diff --git a/test/csl/name_ParticlesDemoteNonDroppingNever.expected b/test/csl/name_ParticlesDemoteNonDroppingNever.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/name_ParticlesDemoteNonDroppingNever.expected
@@ -0,0 +1,61 @@
+<b>Familyname</b>, <i>Givenname al</i>
+<b>Familyname</b>, <i>Givenname dos</i>
+<b>Familyname</b>, <i>Givenname el</i>
+<b>Las Familyname</b>, <i>Givenname de</i>
+<b>Familyname</b>, <i>Givenname lo</i>
+<b>Familyname</b>, <i>Givenname les</i>
+<b>Familyname</b>, <i>Givenname il</i>
+<b>del Familyname</b>, <i>Givenname</i>
+<b>Familyname</b>, <i>Givenname dela</i>
+<b>Familyname</b>, <i>Givenname della</i>
+<b>Familyname</b>, <i>Givenname dello</i>
+<b>Di Familyname</b>, <i>Givenname</i>
+<b>Da Familyname</b>, <i>Givenname</i>
+<b>Do Familyname</b>, <i>Givenname</i>
+<b>Des Familyname</b>, <i>Givenname</i>
+<b>Lou Familyname</b>, <i>Givenname</i>
+<b>Pietro Familyname</b>, <i>Givenname</i>
+<b>de Familyname</b>, <i>Givenname</i>
+<b>La Familyname</b>, <i>Givenname de</i>
+<b>Familyname</b>, <i>Givenname du</i>
+<b>Familyname</b>, <i>Givenname d’</i>
+<b>Le Familyname</b>, <i>Givenname</i>
+<b>La Familyname</b>, <i>Givenname</i>
+<b>L’Familyname</b>, <i>Givenname</i>
+<b>Saint Familyname</b>, <i>Givenname</i>
+<b>Sainte Familyname</b>, <i>Givenname</i>
+<b>St. Familyname</b>, <i>Givenname</i>
+<b>Ste. Familyname</b>, <i>Givenname</i>
+<b>van Familyname</b>, <i>Givenname</i>
+<b>van de Familyname</b>, <i>Givenname</i>
+<b>van der Familyname</b>, <i>Givenname</i>
+<b>van den Familyname</b>, <i>Givenname</i>
+<b>vander Familyname</b>, <i>Givenname</i>
+<b>v.d. Familyname</b>, <i>Givenname</i>
+<b>vd Familyname</b>, <i>Givenname</i>
+<b>van het Familyname</b>, <i>Givenname</i>
+<b>ver Familyname</b>, <i>Givenname</i>
+<b>ten Familyname</b>, <i>Givenname</i>
+<b>ter Familyname</b>, <i>Givenname</i>
+<b>te Familyname</b>, <i>Givenname</i>
+<b>Familyname</b>, <i>Givenname op de</i>
+<b>in de Familyname</b>, <i>Givenname</i>
+<b>in ’t Familyname</b>, <i>Givenname</i>
+<b>’t Familyname</b>, <i>Givenname</i>
+<b>in het Familyname</b>, <i>Givenname</i>
+<b>uit de Familyname</b>, <i>Givenname</i>
+<b>uit den Familyname</b>, <i>Givenname</i>
+<b>Familyname</b>, <i>Givenname von</i>
+<b>Familyname</b>, <i>Givenname von der</i>
+<b>Familyname</b>, <i>Givenname von dem</i>
+<b>Familyname</b>, <i>Givenname von zu</i>
+<b>v. Familyname</b>, <i>Givenname</i>
+<b>v Familyname</b>, <i>Givenname</i>
+<b>Familyname</b>, <i>Givenname vom</i>
+<b>Familyname</b>, <i>Givenname das</i>
+<b>Familyname</b>, <i>Givenname zum</i>
+<b>Familyname</b>, <i>Givenname zur</i>
+<b>Familyname</b>, <i>Givenname den</i>
+<b>Familyname</b>, <i>Givenname der</i>
+<b>Familyname</b>, <i>Givenname des</i>
+<b>Familyname</b>, <i>Givenname auf den</i>
diff --git a/test/csl/number_OrdinalSpacing.expected b/test/csl/number_OrdinalSpacing.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/number_OrdinalSpacing.expected
@@ -0,0 +1,1 @@
+Blah blah. 7th, p. 3rd–8thDD<i>ed</i>
diff --git a/test/csl/number_PlainHyphenOrEnDashAlwaysPlural.expected b/test/csl/number_PlainHyphenOrEnDashAlwaysPlural.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/number_PlainHyphenOrEnDashAlwaysPlural.expected
@@ -0,0 +1,1 @@
+His Anonymous Life (1) pages 1–2 (cs:text) vs His Anonymous Life (1) pages 1–2 (cs:number); His Anonymous Life (2) pages i–ix (cs:text) vs His Anonymous Life (2) pages i–ix (cs:number); His Anonymous Life (3) page 3-B (cs:text) vs His Anonymous Life (3) page 3-B (cs:number); His Anonymous Life (4) pages Michaelson–Morely (cs:text) vs His Anonymous Life (4) pages Michaelson–Morely (cs:number)
diff --git a/test/csl/page_Chicago.txt b/test/csl/page_Chicago.txt
--- a/test/csl/page_Chicago.txt
+++ b/test/csl/page_Chicago.txt
@@ -22,6 +22,7 @@
 Example P, at 13792–803
 Example Q, at 1496–1504
 Example R, at 2787–2816
+Example S, at 11153–2359
 <<===== RESULT =====<<
 
 
@@ -116,6 +117,11 @@
         {
             "id": "ITEM-18"
         }
+    ],
+    [
+        {
+            "id": "ITEM-19"
+        }
     ]
 ]
 <<===== CITATION-ITEMS =====<<
@@ -252,9 +258,15 @@
         "type": "book"
     }, 
     {
-        "id": "ITEM-18", 
-        "page": "2787-816", 
-        "title": "Example R", 
+        "id": "ITEM-18",
+        "page": "2787-816",
+        "title": "Example R",
+        "type": "book"
+    },
+    {
+        "id": "ITEM-19",
+        "page": "11153-12359",
+        "title": "Example S",
         "type": "book"
     }
 ]
diff --git a/test/csl/position_FirstTrueOnlyOnce.expected b/test/csl/position_FirstTrueOnlyOnce.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/position_FirstTrueOnlyOnce.expected
@@ -0,0 +1,2 @@
+Appleton “Tom Swift and His Electric Runabout” (1910).
+ibid. p. 23.
diff --git a/test/csl/position_IbidInText.expected b/test/csl/position_IbidInText.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/position_IbidInText.expected
@@ -0,0 +1,3 @@
+Appleton “Tom Swift and His Electric Runabout” (1910).
+Bloggs “A Very Short Book Indeed” (2012).
+Appleton “Tom Swift and His Electric Runabout” (1910).
diff --git a/test/csl/position_IbidSeparateCiteSameNote.expected b/test/csl/position_IbidSeparateCiteSameNote.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/position_IbidSeparateCiteSameNote.expected
@@ -0,0 +1,7 @@
+[citation1-item1-note1] Appleton “Tom Swift and His Electric Runabout” (1910).
+[citation2-item1-note2] ibid.
+[citation3-item1-note2] ibid. page 33.
+[citation4-item2-note3] Bloggs “A Very Short Book Indeed” (2012); [citation4-item1-note3] Appleton supra.
+[citation5-item1-note4] Appleton supra page 99.
+[citation6-item1-note4] Appleton supra.
+[citation7-item1-note4] ibid.
diff --git a/test/csl/position_IbidWithLocator.expected b/test/csl/position_IbidWithLocator.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/position_IbidWithLocator.expected
@@ -0,0 +1,2 @@
+Appleton “Tom Swift and His Electric Runabout” (1910).
+ibid. p. 23.
diff --git a/test/csl/position_IbidWithMultipleSoloCitesInBackref.expected b/test/csl/position_IbidWithMultipleSoloCitesInBackref.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/position_IbidWithMultipleSoloCitesInBackref.expected
@@ -0,0 +1,4 @@
+Aalto
+Álvarez
+Álvarez
+ibid.
diff --git a/test/csl/position_IfIbidWithLocatorIsTrueThenIbidIsTrue.expected b/test/csl/position_IfIbidWithLocatorIsTrueThenIbidIsTrue.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/position_IfIbidWithLocatorIsTrueThenIbidIsTrue.expected
@@ -0,0 +1,2 @@
+Appleton “Tom Swift and His Electric Runabout” (1910).
+ibid.
diff --git a/test/csl/position_NearNoteSameNote.expected b/test/csl/position_NearNoteSameNote.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/position_NearNoteSameNote.expected
@@ -0,0 +1,3 @@
+Plain+Vanilla:Book-A; Near+Ibid:Book-A
+Plain+Vanilla:Book-B
+Near+Ibid:Book-B; Plain+Vanilla:Book-A
diff --git a/test/csl/position_ResetNoteNumbers.expected b/test/csl/position_ResetNoteNumbers.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/position_ResetNoteNumbers.expected
@@ -0,0 +1,8 @@
+Book A, n 1 (note 1)
+ibid (note 2)
+Book C, n 3 (note 3)
+ibid (note 1)
+Book A, n 1 (note 2)
+ibid (note 3)
+Book C, n 3 (note 4)
+Book A, n 1 (note 5)
diff --git a/test/csl/punctuation_FullMontyQuotesIn.expected b/test/csl/punctuation_FullMontyQuotesIn.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/punctuation_FullMontyQuotesIn.expected
@@ -0,0 +1,47 @@
+ENDING IN COLON
+“colon”: colon
+“period.”: colon
+“semicolon”; colon
+“exclamation”! colon
+“question”? colon
+“comma,”: colon
+
+ENDING IN PERIOD
+“colon”: period
+“period.” period
+“semicolon”; period
+“exclamation”! period
+“question”? period
+“comma,”. period
+
+ENDING IN SEMICOLON
+“colon”:; semicolon
+“period.”; semicolon
+“semicolon”; semicolon
+“exclamation”!; semicolon
+“question”?; semicolon
+“comma,”; semicolon
+
+ENDING IN EXCLAMATION
+“colon”! exclamation
+“period.”! exclamation
+“semicolon”! exclamation
+“exclamation”! exclamation
+“question”?! exclamation
+“comma,”! exclamation
+
+ENDING IN QUESTION
+“colon”? question
+“period.”? question
+“semicolon”? question
+“exclamation”!? question
+“question”? question
+“comma,”? question
+
+ENDING IN COMMA
+“colon”:, comma
+“period.”, comma
+“semicolon”;, comma
+“exclamation”!, comma
+“question”?, comma
+“comma,” comma
diff --git a/test/csl/quotes_QuotesUnderQuotesFalse.expected b/test/csl/quotes_QuotesUnderQuotesFalse.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/quotes_QuotesUnderQuotesFalse.expected
@@ -0,0 +1,3 @@
+<div class="csl-bib-body">
+  <div class="csl-entry"> ’Title with ‘quotes’ in it’,.</div>
+</div>
diff --git a/test/csl/sort_BibliographyCitationNumberDescending.expected b/test/csl/sort_BibliographyCitationNumberDescending.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/sort_BibliographyCitationNumberDescending.expected
@@ -0,0 +1,10 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">[8] Book 008</div>
+  <div class="csl-entry">[7] Book 007</div>
+  <div class="csl-entry">[6] Book 005</div>
+  <div class="csl-entry">[5] Book 002</div>
+  <div class="csl-entry">[4] Book 006</div>
+  <div class="csl-entry">[3] Book 004</div>
+  <div class="csl-entry">[2] Book 003</div>
+  <div class="csl-entry">[1] Book 001</div>
+</div>
diff --git a/test/csl/sort_BibliographyCitationNumberDescendingViaCompositeMacro.expected b/test/csl/sort_BibliographyCitationNumberDescendingViaCompositeMacro.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/sort_BibliographyCitationNumberDescendingViaCompositeMacro.expected
@@ -0,0 +1,6 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">[1] Aaaa</div>
+  <div class="csl-entry">[2] Bbbb</div>
+  <div class="csl-entry">[3] Xxxx</div>
+  <div class="csl-entry">[4] Zzzz</div>
+</div>
diff --git a/test/csl/sort_BibliographyCitationNumberDescendingViaMacro.expected b/test/csl/sort_BibliographyCitationNumberDescendingViaMacro.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/sort_BibliographyCitationNumberDescendingViaMacro.expected
@@ -0,0 +1,10 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">[1] Book One</div>
+  <div class="csl-entry">[2] Book Three</div>
+  <div class="csl-entry">[3] Book Four</div>
+  <div class="csl-entry">[4] Book Six</div>
+  <div class="csl-entry">[5] Book Two</div>
+  <div class="csl-entry">[6] Book Five</div>
+  <div class="csl-entry">[7] Book Seven</div>
+  <div class="csl-entry">[8] Book Eight</div>
+</div>
diff --git a/test/csl/sort_OmittedBibRefMixedNumericStyle.expected b/test/csl/sort_OmittedBibRefMixedNumericStyle.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/sort_OmittedBibRefMixedNumericStyle.expected
@@ -0,0 +1,5 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">1. Anderson, Book One</div>
+  <div class="csl-entry">[CSL STYLE ERROR: reference with no printed form.]</div>
+  <div class="csl-entry">3. Crane, Book Two</div>
+</div>
diff --git a/test/csl/sort_OmittedBibRefMixedNumericStyle.txt b/test/csl/sort_OmittedBibRefMixedNumericStyle.txt
--- a/test/csl/sort_OmittedBibRefMixedNumericStyle.txt
+++ b/test/csl/sort_OmittedBibRefMixedNumericStyle.txt
@@ -2,6 +2,27 @@
 bibliography
 <<==== MODE ====<<
 
+>>==== DESCRIPTION ====>>
+
+This depends on
+
+1. identifying when citation-number is used,
+
+2. outputting a particular error message in place of a reference that produces
+   no output, to maintain citation-number sequencing, and
+
+2. rendering the <bibliography/> <text variable="citation-number"/>
+   for the omitted reference, ignoring the conditions that omitted the
+   reference.
+
+For an implementation example, see
+https://github.com/zotero/citeproc-rs/blob/master/crates/proc/src/db.rs#L1414
+
+Compare to the sort_OmittedBibRefNonNumericStyle test which has a similar
+non-rendering reference but no citation-numbers.
+
+<<==== DESCRIPTION ====<<
+
 >>==== RESULT ====>>
 <div class="csl-bib-body">
   <div class="csl-entry">1. Anderson, Book One</div>
@@ -27,7 +48,7 @@
 <<==== CITATION-ITEMS ====<<
 
 >>==== CSL ====>>
-<style 
+<style
       xmlns="http://purl.org/net/xbiblio/csl"
       class="note"
       version="1.0">
@@ -120,4 +141,3 @@
 >>===== VERSION =====>>
 1.0
 <<===== VERSION =====<<
-
diff --git a/test/csl/sort_OmittedBibRefNonNumericStyle.expected b/test/csl/sort_OmittedBibRefNonNumericStyle.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/sort_OmittedBibRefNonNumericStyle.expected
@@ -0,0 +1,5 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">Anderson, Book One</div>
+  <div class="csl-entry">[CSL STYLE ERROR: reference with no printed form.]</div>
+  <div class="csl-entry">Crane, Book Two</div>
+</div>
diff --git a/test/csl/sort_RangeUnaffected.expected b/test/csl/sort_RangeUnaffected.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/sort_RangeUnaffected.expected
@@ -0,0 +1,2 @@
+<sup>1–3</sup>
+<sup>3</sup>
diff --git a/test/csl/substitute_SubstituteOnlyOnceTermEmpty.expected b/test/csl/substitute_SubstituteOnlyOnceTermEmpty.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/substitute_SubstituteOnlyOnceTermEmpty.expected
@@ -0,0 +1,1 @@
+[CSL STYLE ERROR: reference with no printed form.]
diff --git a/test/csl/testers_FirstAutoGeneratedZoteroPluginTest.expected b/test/csl/testers_FirstAutoGeneratedZoteroPluginTest.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/testers_FirstAutoGeneratedZoteroPluginTest.expected
@@ -0,0 +1,2 @@
+Center &#60;sup&#62;for&#60;/sup&#62; History &#60;sub&#62;and&#60;/sub&#62; New Media, “<b>Zotero</b> … ‘Quick Start’ &#38; <span style="font-variant:small-caps;">Guide</span> 日本語,” 47, http://zotero.org/support/quick_start_guide.
+John Smith, <i>Book A</i>, 2000; Center &#60;sup&#62;for&#60;/sup&#62; History &#60;sub&#62;and&#60;/sub&#62; New Media, “<b>Zotero</b> … ‘Quick Start’ &#38; <span style="font-variant:small-caps;">Guide</span> 日本語.”
diff --git a/test/csl/testers_SecondAutoGeneratedZoteroPluginTest.expected b/test/csl/testers_SecondAutoGeneratedZoteroPluginTest.expected
new file mode 100644
--- /dev/null
+++ b/test/csl/testers_SecondAutoGeneratedZoteroPluginTest.expected
@@ -0,0 +1,5 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">Center &#60;sup&#62;for&#60;/sup&#62; History &#60;sub&#62;and&#60;/sub&#62; New Media. “<b>Zotero</b> … ‘Quick Start’ &#38; <span style="font-variant:small-caps;">Guide</span> 日本語.” http://zotero.org/support/quick_start_guide.</div>
+  <div class="csl-entry">Smith, John. <i>Book A</i>, 2000.</div>
+  <div class="csl-entry">Smith, Steven. <i>Book A</i>, 2000.</div>
+</div>
diff --git a/test/overrides/flipflop_NumericField.expected b/test/overrides/flipflop_NumericField.expected
new file mode 100644
--- /dev/null
+++ b/test/overrides/flipflop_NumericField.expected
@@ -0,0 +1,1 @@
+1er
diff --git a/test/overrides/fullstyles_ABdNT.expected b/test/overrides/fullstyles_ABdNT.expected
new file mode 100644
--- /dev/null
+++ b/test/overrides/fullstyles_ABdNT.expected
@@ -0,0 +1,3 @@
+<div class="csl-bib-body">
+  <div class="csl-entry">COLE, S. J.; MOORE, R. Hydrological modelling using raingauge- and radar-based estimators of areal rainfall. <b>Journal of Hydrology</b>, v. 358, n. 3-4, p. 159–181, 2008.</div>
+</div>
